動態數組


動態數組:

  雖然,前邊我們講過的用new給基本類型和對象在運行時分配內存,但它們的已寸在編譯時就已經確定下來------因為我們為之申請內存的數據類型在程序里有明確的定義,有明確的單位長度!
  可是,總有些時候,必須要等到程序運行時才能確定需要申請多少內存,甚至還需要根據程序的運行情況追加申請更多的內存。
從某種意義上講,這樣的內存管理才是真正的動態!這一講中,我們將帶大家編寫一個程序為一個整數型數組分配內存,實現動態數組。

  我們今天要寫一個程序,能夠在程序運行時讓用戶輸入一個值自行定義數組的長度。
  在動手編寫這個栗子之前,很有必要給大家復習和進一步討論下數組和指針的關系。在即將編寫的栗子程序里有一個數組,它的長度在編寫這個程序時是未知的,這意味着無法在定義這個數組時在方括號里給出一個准確的數字。

int a[???];

 

新建一個動態數組:

如何解決這個問題呢?
  不知道大家在腦里會將數組和什么掛鈎呢?嗯,沒錯,是指針!
  數組名和下標操作符[]的組合可以被替換成一個指向該數組的基地址的指針和對應的指針運算:

int a[20];
int *x=a;

  指針變量x指向數組a的地址,a[0]和*×都代去教組的第一個元素。

  於是,根據括針運算原則,a[1]等價於*(x+1)、a[2]等價於*(x+2),以此類推。大家想想,我們把這個邏輯倒過來,會怎樣?嗯,反過來也成立,並且幫了我們一個大忙:

  • 把一個數組聲明傳遞給new語句將隨它返回一個該數組基類型的指針。
  • 把數組下標操作符和該指針變量的名字搭配使用就可以像對待一個數組那樣使用new 語句為這個數組分配的內存塊了。
//例如:
int *x = new int[10];
//可以像對待一個數組那樣使用括針變量x:
×[1]=45;
X[2]=8;
//當然,也可以用一個變量來保存該數組的元素個數:
int count = 10;
int *x = new int[count];

  

刪除一個動態數組:
  刪除一個動態數組要比刪除其他動態數據類型稍微復雜一點。
  因為用來保存數組地址的變量只是一個簡單的格針,所以需要明確地告訴編譯器它應該刪除一個數組!
  具體的做法是在delete 保留字的后面加上一對方括號:

delete []x;

  這樣的語法可能大家覺得挺葩,但確實頂用,接下來的栗子給大家做下演示!

#include<iostream>
#include<string>

int main()
{
	unsigned int count = 0;//變量在棧里申請內存
	
	std::cout << "請輸入數組的元素個數:\n";
	std::cin >> count;
	
	int *x = new int[count];//動態內存在堆里申請內存
	
	for(int i = 0; i < count; i++)
	{
		x[i] = i;
	} 
	
	for(int i = 0; i <count; i++)
	{
		std::cout<< "x["<<i<<"]的值是:"<<x[i]<<"\n"; 
	}
	
	return 0;
}

 

  

 

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM