引言
要搞懂下面這些例題,首先你要知道關于陣列名的意義以下這幾點:
陣列名的意義:
- sizeof(陣列名),這里的陣列名表示整個陣列,計算的是整個陣列的大小,
- &陣列名,這里的陣列名表示整個陣列,取出的是整個陣列的地址,
- 除此之外所有的陣列名都表示首元素的地址,
一維陣列
//32位平臺下
//一維陣列
int main()
{
int a[] = { 1, 2, 3, 4 };
printf("%d\n", sizeof(a));//16
//計算的是整個陣列的大小,整個陣列4個元素,每個元素位元組大小為4,所以結果為4 * 4 = 16
printf("%d\n", sizeof(a + 0));//4
//a + 0表示的是第一個元素的地址,它計算的是地址的大小,地址的大小在32位平臺下為4,在64位平臺下為8
printf("%d\n", sizeof(*a));//4
//a在這里表示為陣列首元素的地址,即1的地址,對1的地址解參考,就是求陣列首元素的大小,1是整型,整型大小為4
printf("%d\n", sizeof(a + 1));//4
//a在這里表示為首元素的地址,首元素地址加1表示跳過一個元素,a + 1指向的是第二個元素的地址,第二個元素的地址大小為4
printf("%d\n", sizeof(a[1]));//4
//計算陣列第二個元素的大小,即結果為4
printf("%d\n", sizeof(&a));//4
//計算的是整個陣列的地址,只要求地址的大小,就記住,32位平臺下大小為4,64位平臺下大小為8.這里結果是4
printf("%d\n", sizeof(*&a));//16
//計算的是整個陣列的大小,&a表示取出的是整個陣列的地址,然后對整個陣列的地址進行解參考,所以計算的就是整個陣列的大小,結果為16
printf("%d\n", sizeof(&a + 1));//4
//這里&a表示的是整個陣列的地址,它加1,即是跳過整個陣列,然后指向下一個位置的地址,即陣列后面的空間的地址,結果為4.
printf("%d\n", sizeof(&a[0]));//4
//計算的是陣列第一個元素的地址的大小,結果為4
printf("%d\n", sizeof(&a[0] + 1));//4
//計算的是陣列第二個元素的地址的大小,結果為4
return 0;
}
字符陣列
//32位平臺下
//字符陣列
int main()
{
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", sizeof(arr));//6
//陣列名單獨放在sizeof內部,計算的是整個陣列的大小,因為陣列有6個元素,每個元素是char型別,所以結果為6
printf("%d\n", sizeof(arr + 0));//4
//表示的是首元素地址,結果為4
printf("%d\n", sizeof(*arr));//1
//表示的是對陣列首元素地址進行解參考,計算的是字符‘a’的大小,為1
printf("%d\n", sizeof(arr[1]));//1
//計算的是字符‘b’的大小,結果為1
printf("%d\n", sizeof(&arr));//4
//計算的整個陣列的地址大小,結果為4
printf("%d\n", sizeof(&arr + 1));//4
//計算的是跳過整個陣列后的位置的地址,結果為4
printf("%d\n", sizeof(&arr[0] + 1));//4
//計算的是第二個元素,字符‘b’的地址,結果為4
printf("%d\n", strlen(arr));//隨機值
//這里的arr表示首元素地址,strlen是求長度,給一個地址,從前向后數,遇到‘\0’停下來,
//這里沒有‘\0',故結果是隨機值,準確的說是比6大的隨機值,因為陣列里面已經有了6個元素,
printf("%d\n", strlen(arr + 0));//隨機值
//這里的arr + 0表示首元素地址.故結果也是隨機值
printf("%d\n", strlen(*arr));//報錯
//首先strlen()的使用,它接收的得是一個地址;而*arr在這里表示的是字符‘a’,把字符給它傳過去,故結果會報錯
printf("%d\n", strlen(arr[1]));//報錯
//同上,結果報錯
printf("%d\n", strlen(&arr));//
//&arr在這里表示的是陣列地址,把陣列地址給strlen傳過去,strlen接收它,
//站在它的角度,依然是字串的地址,依然是從字符‘a’的地址開始向后數,故結果仍是隨機值
printf("%d\n", strlen(&arr + 1));//隨機值
//在這里計算的是從跳過整個陣列后的位置的地址,開始向后數直到遇到‘\0',才停止的長度,故為隨機值,
//準確來說,與上面的區別來說,結果為隨機值-6.
printf("%d\n", strlen(&arr[0] + 1));//隨機值
//從字符‘b’開始向后數,結果也為隨機值,準確來說,結果為隨機值 - 1.
char arr[] = "abcdef";
//[a b c d e f \0]
printf("%d\n", sizeof(arr));//7
//計算的是整個陣列的大小,結果為7
printf("%d\n", sizeof(arr + 0));//4
//計算的是首元素地址a的大小,結果為1
printf("%d\n", sizeof(*arr));//1
//對陣列的首元素地址進行解參考,即計算的是a的大小,結果為1
printf("%d\n", sizeof(arr[1]));//1
//計算的是字符b的大小,結果為1
printf("%d\n", sizeof(&arr));//4
//計算的是整個陣列的地址,結果為4
printf("%d\n", sizeof(&arr + 1));//4
//計算的是跳過整個陣列的后的位置的地址,結果為4
printf("%d\n", sizeof(&arr[0] + 1));//4
//計算的是b的地址,結果為4
printf("%d\n", strlen(arr));//6
//計算的是字串的長度,從a的地址開始向后數,遇到\0停止,結果為6
printf("%d\n", strlen(arr + 0));//6
//從a的地址開始向后數,遇到\0停止,結果為6
printf("%d\n", strlen(*arr));//報錯
//傳給strlen的不是地址,故結果報錯
printf("%d\n", strlen(arr[1]));//報錯
//傳給strlen的不是地址,故結果報錯
printf("%d\n", strlen(&arr));//6
//從a的地址開始向后數,遇到\0停止,結果為6
printf("%d\n", strlen(&arr + 1));//隨機值
//跳過整個陣列之后的位置的地址開始向后數,不知何時遇到\0,故結果為隨機值
printf("%d\n", strlen(&arr[0] + 1));//5
//從b的地址開始向后數,遇到\0停止,結果為5
char *p = "abcdef";
printf("%d\n", sizeof(p));//4
//計算的是指標變數的大小,p在這里是一個字符指標,結果為4
printf("%d\n", sizeof(p + 1));//4
//p本來是a的地址,p + 1 就變成了b的地址,故結果為4
printf("%d\n", sizeof(*p));//1
//p是a的地址,對a解參考,計算的是a的大小,結果為1
printf("%d\n", sizeof(p[0]));//1
//p[0]等同于*(p + 0),計算的是a的大小,結果為1
printf("%d\n", sizeof(&p));//4
//計算的是p的地址,結果為4
printf("%d\n", sizeof(&p + 1));//4
//計算的是跳過p后的位置的地址,結果為4
printf("%d\n", sizeof(&p[0] + 1));//4
//計算的是b的地址,結果為4
printf("%d\n", strlen(p));//6
//把a的地址交給p,從a的地址開始數,結果為6
printf("%d\n", strlen(p + 1));//5
//從b的地址開始數,結果為5
printf("%d\n", strlen(*p));//報錯
//傳給strlen的不是地址,故結果報錯
printf("%d\n", strlen(p[0]));//報錯
//傳給strlen的不是地址,故結果報錯
printf("%d\n", strlen(&p));//隨機值
//p的地址不清楚,故結果為隨機值
printf("%d\n", strlen(&p + 1));//隨機值
//跳過p的后的位置的地址,結果為隨機值
printf("%d\n", strlen(&p[0] + 1));//5
//從b的地址開始數,結果為5
return 0;
}
二維陣列
//二維陣列
int main()
{
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));//48
//計算的是整個陣列的大小,二維陣列,三行四列,共有12個元素,每個元素是int型,故結果為48
printf("%d\n", sizeof(a[0][0]));//4
//計算的是第一行第一個元素的大小,結果為4
printf("%d\n", sizeof(a[0]));//16
//把a[0]看作一個一維陣列,那么a[0]就可以看作一維陣列的陣列名,陣列名單獨放在sizeof內部,
//所以a[0]表示整個的第一行,計算的是整個第一行的大小,第一行有4個元素,結果為16
printf("%d\n", sizeof(a[0] + 1));//4
//a[0]作為陣列名并沒有單獨放在sizeof內部,也沒有取地址,
//因此在這里表示的是第一行第一個元素的地址,加1表示的是第一行第二個元素的地址,故結果為4
printf("%d\n", sizeof(*(a[0] + 1)));//4
//同上,對第一行第二個元素解參考得到一個整型元素,大小為4.
printf("%d\n", sizeof(a + 1));//4
//二維陣列陣列名a在這里表示首元素地址,即第一行的地址,第一行地址加1,得到的是第二行的地址,結果為4
printf("%d\n", sizeof(*(a + 1)));//16
//*(a + 1)等同于a[1],把a[1]看作一維陣列的陣列名,則計算的是第二行的大小,結果為16
//a + 1是第二行的地址,對第二行解參考,則求的是整個第二行的大小
printf("%d\n", sizeof(&a[0] + 1));//4
//對第一行的陣列名取地址,得到第一行的地址,加1得到的就是第二行的地址,結果為4
printf("%d\n", sizeof(*(&a[0] + 1)));//16
//對第二行的地址進行解參考,計算的就是整個第二行的大小
printf("%d\n", sizeof(*a));//16
//a在這里表示首元素的地址,二維陣列的首元素就是第一行,
//即a表示第一行的地址,對第一行的地址解參考,得到的就是整個第一行的大小
printf("%d\n", sizeof(a[3]));//16
//sizeof()內部的運算式是不計算的,因此不會去訪問它,
//根據它的型別屬性我們可以知道a[3]等同于a[0] a[1] a[2],因此在這里它的結果為16.
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/291687.html
標籤:其他
