sizeof與陣列的關係,之前困惑了很久,搞清楚後在這裏記錄一下,防止後面再遺忘了。
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int b[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位元編譯系統(VS2017 x64)中用多少位元組來表示一個地址,結果爲8
//而對32編譯系統(VS2017 Win32)結果則爲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