下面這個例子,檢驗new給double型陣列分配的儲存空間的首位址是多少。s是指向這個陣列的指標,s+1即是指標移動一位,指向下乙個元素。
[ root@sparkmaster test]# cat newarray.cpp
#include int main()
{ double * s;
int i;
s = new double[10]; //分配一片儲存空間給s,s指向這片空間的首位址。這片空間將要存的是10個double型數值
std::cout<<"before giving value,s is "<
執行結果如下:
[ root@sparkmaster test]# g++ -o newarray newarray.cpp
[root@sparkmaster test]# ./newarray
before giving value,s is 0x17aa010,*s is 0
after giving value:
&s[0]=0x17aa010
s[0]=100
&s[1]=0x17aa018
s[1]=101
&s[2]=0x17aa020
s[2]=102
&s[3]=0x17aa028
s[3]=103
&s[4]=0x17aa030
s[4]=104
&s[5]=0x17aa038
s[5]=105
&s[6]=0x17aa040
s[6]=106
&s[7]=0x17aa048
s[7]=107
&s[8]=0x17aa050
s[8]=108
&s[9]=0x17aa058
s[9]=109
s is 0x17aa010
s+1 is:0x17aa018
s+2 is:0x17aa020
s+3 is:0x17aa028
s+4 is:0x17aa030
s+5 is:0x17aa038
s+6 is:0x17aa040
s+7 is:0x17aa048
s+8 is:0x17aa050
s+9 is:0x17aa058
可見,陣列的元素位址跟指標是一一對應的,s[0]的位址即是s指標的記憶體,s[1]的位址即是s+1指標的內容。那為什麼s+1,位址卻不是加1,實際是8(0x17aa020-0x17aa018=0x8)?哦對了,因為double型別的單位長度是8 byte!
另外,此例也驗證了,如果s是指向陣列的指標,s[i]即是陣列中第i個元素的值,而不是*s[i],實際上*s[i]是個非法表示。若要表示s[i]元素的位址,應該是&s[i].
儲存空間動態分配
ansi c說明了三個用於儲存空間動態分配的函式 1 malloc 分配指定位元組數的儲存區。此儲存區中的初始值不確定 2 calloc 為指定長度的物件,分配能容納其指定個數的儲存空間。該空間中的每一位 bit 都初始化為0 3 realloc 更改以前分配區的長度 增加或減少 當增加長度時,可能...
C 之儲存空間的動態分配和釋放
很多時候,我們需要根據問題的實際規模來定義陣列的大小,即確定實際需要使用的儲存空間的大小,這個時候就要用到動態申請 釋放儲存空間的方法。一般情況下,變數儲存空間的分配和釋放是由系統自動完成的,不需要我們的干預。系統對自動分配記憶體的變數的訪問方式有兩種 在程式執行中動態申請 釋放記憶體的變數,只能通...
C 擴充動態分配陣列的儲存空間
這裡直接示例 include include using namespace std intmain int argc,char ar 開闢一段更大的記憶體 int pointer newint 10 將原始記憶體的資料 拷貝到新的記憶體裡 memcpy pointer,p,sizeof int 5...