C語言中sizeof 與一維陣列和二維陣列 - tw511教學網

文章推薦指數: 80 %
投票人數:10人

C語言中sizeof 與一維陣列和二維陣列. ... 對陣列名用sizeof表示求這個陣列在記憶體中所佔空間總的大小,結果爲4*10=40 printf("sizeof(a[0])= %d\n", ... 技術文章»C語言中sizeof與一維陣列和二維陣列 C語言中sizeof與一維陣列和二維陣列 2020-08-0812:41:40 sizeof與陣列的關係,之前困惑了很久,搞清楚後在這裏記錄一下,防止後面再遺忘了。

inta[10]={1,2,3,4,5,6,7,8,9,10}; intb[2][3]={0}; printf("sizeof(a)=%d\n",sizeof(a)); //對陣列名用sizeof表示求這個陣列在記憶體中所佔空間總的大小,結果爲4*10=40 printf("sizeof(a[0])=%d\n",sizeof(a[0]));//求陣列第一個元素的大小,結果爲4 printf("sizeof(*a)=%d\n",sizeof(*a));//這裏需明白陣列名錶示的是陣列第一個元素的首地址 //即a=&a[0],所以*a=a[0],結果同sizeof(a[0]),也爲4 printf("sizeof(&a[0])=%d\n",sizeof(&a[0]));//表示求元素a[0]的地址所佔空間大小, //或者說求在本64位元編譯系統(VS2017x64)中用多少位元組來表示一個地址,結果爲8 //而對32編譯系統(VS2017Win32)結果則爲4 printf("sizeof(&a[1])=%d\n",sizeof(&a[1]));//表示求元素a[1]的地址所佔空間大小,結果也爲8 //對於64位元的編譯系統,恆用8個位元組表示一個地址,即求地址的sizeof恆爲8 printf("*(&a[1]+1)=%d\n",*(&a[1]+1));//對於地址的加減,其移動的大小取決於地址中元素的大小 //這裏地址&a[1]中的元素a[1]爲4個位元組,故加1後向後移動四個位元組,其內容爲a[2],結果爲3。

printf("*(&a[1]-1)=%d\n",*(&a[1]-1));//在地址&a[1]基礎上向前移動四個位元組,結果爲a[0]=1。

printf("sizeof(&a[1]+1)=%d\n",sizeof(&a[1]+1)); //&a[1]+1表示元素a[2]的地址,即&a[2],求地址的sizeof結果恆爲8 printf("sizeof(a+1)=%d\n\n",sizeof(a+1));//陣列名錶示的是陣列第一個元素的地址(即a=&a[0]) //加1後向後移動4個位元組即a+1=&a[1],求其sizeof結果爲8 //對於二維陣列首先要明白二維陣列b[M][N]會被系統解釋爲長度爲M一維陣列 //然後這個一維陣列的每個元素又是長度爲N的一維陣列。

//如元素b[0][N]爲長度爲N的一維陣列,b[0]是該陣列的陣列名。

所以二維陣列又稱爲陣列的陣列 printf("sizeof(b)=%d\n",sizeof(b));//對二維陣列名用sizeof表示求這個陣列在記憶體中 //所佔空間總的大小,結果爲(2*3)*4=24 printf("sizeof(b[0][0])=%d\n",sizeof(b[0][0]));//求二維陣列中第一個元素的大小 //(通常意義上的第一,並不是系統理解的第一個元素爲b[0]),其型別爲int,結果爲4 printf("sizeof(b[0])=%d\n",sizeof(b[0]));//b[0]被系統解釋爲長度爲3的一維陣列 //b[0]爲該陣列的陣列名,對陣列名用sizeof表示求這個陣列總的大小,結果爲3*4=12 printf("sizeof(b[1])=%d\n",sizeof(b[1])); //b[1]同樣被系統解釋爲長度爲3的一維陣列,b[1]爲該陣列的陣列名,結果爲3*4=12 printf("sizeof(b[0]+1)=%d\n",sizeof(b[0]+1));//陣列名錶示陣列第一個元素的首地址 //所以b[0]=&b[0][0]。

地址的加減,其移動大小取決於地址中元素b[0][0]的大小(爲4個位元組) //地址&b[0][0]往後移動4個位元組爲地址&b[0][1]。

所以b[0]+1=&b[0][1],求其sizeof結果爲8 printf("sizeof(b+1)=%d\n",sizeof(b+1));//陣列名錶示陣列第一個元素的首地址,所以b=&b[0]。

//地址的加減,其移動大小取決於地址中元素b[0]的大小(爲12個位元組) //地址&b[0]往後移動12個位元組爲地址&b[1]。

所以b+1=&b[1],是一個地址,求其sizeof結果爲8 printf("sizeof(*b)=%d\n",sizeof(*b));//b=&b[0],所以*b=b[0],同sizeof(b[0]),結果爲12



請為這篇文章評分?