有关数组的运算 (sizeof)(strlen)
一維數(shù)組
int a[ ] = { 1,2,3,4 };
printf("%d\n", sizeof(a)); ? ? ? ? ? ? ? ?//16 ? ?
//數(shù)組名單獨(dú)放在sizeof內(nèi)部,數(shù)組名表示整個(gè)數(shù)組。 sizeof(數(shù)組名)計(jì)算的是整個(gè)數(shù)組的大小,單位是字節(jié)。
printf("%d\n", sizeof(a + 0)); ? ? ? ? ?//4 ? ? 不是單獨(dú)放在sizeof內(nèi)部,它表示首元素地址
printf("%d\n", sizeof(*a)); ? ? ? ? ? ? ? //4 ? ? 首元素
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// ? *a == *(a + 0) == a[0];
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// ? arr[i] ==> *(arr + i)
printf("%d\n", sizeof(a + 1)); ? ? ? ? ?//4 ? ? 第二個(gè)元素地址?
printf("%d\n", sizeof(a[1])); ? ? ? ? ? ?//4 ? ??第二個(gè)元素
printf("%d\n", sizeof(&a)); ? ? ? ? ? ??//4 ? ? ?&a取的是數(shù)組的地址,無論取誰的地址,都是4個(gè)字節(jié)(32位)
拓展:
我們來看看下面這些
printf("%p\n", &a[0]); printf("%p\n", a); printf("%p\n", &a);它們的結(jié)果是
那改成下面這樣呢,再來看
printf("%p\n", &a[0] ); printf("%p\n", &a[0]+1); printf("%p\n", a); printf("%p\n", a + 1); printf("%p\n", &a); printf("%p\n", &a + 1);結(jié)果如下
?
我們發(fā)現(xiàn),&a[0] + 1和a + 1都跳了4個(gè)字節(jié),即跳到第二個(gè)元素,而&a+1它跳過了16個(gè)字節(jié),也就是跳過了整個(gè)數(shù)組
printf("%d\n", sizeof(*&a)); ? ? ? ? ? ?//16 ? 指針訪問整個(gè)數(shù)組
printf("%d\n", sizeof(&a + 1)); ? ? ? //4 ? ? 跳過整個(gè)數(shù)組的下一個(gè)地址
printf("%d\n", sizeof(&a[0])); ? ? ? ? //4 ? ??
printf("%d\n", sizeof(&a[0] + 1)); ? //4
?
?
字符數(shù)組
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr)); ? ? ? ? ? ? ?//6 ? ? 整個(gè)數(shù)組
printf("%d\n", sizeof(arr+0)); ? ? ? ? //4 ? ? 首元素地址(不要以為是char類型就以為是1,它就是個(gè)地址)
printf("%d\n", sizeof(*arr)); ? ? ? ? ? ?//1 ? ? 首元素
printf("%d\n", sizeof(arr[1])); ? ? ? ? //1 ? ? 第二個(gè)元素
printf("%d\n", sizeof(&arr)); ? ? ? ? ? //4 ? ?首元素地址
printf("%d\n", sizeof(&arr+1)); ? ? ?//4 ? ??跳過這個(gè)數(shù)組后的地址
printf("%d\n", sizeof(&arr[0]+1)); ?//4 ? ? 第二個(gè)首元素地址
?
//strlen ?求字符串長度
printf("%d\n", strlen(arr)); ? ? ? ? ? ? ?// ? ? 隨機(jī)值 ? ? ? strlen求字符串長度需要字符串以\0結(jié)束,而這個(gè)數(shù)組中沒有\(zhòng)n
printf("%d\n", strlen(arr + 0)); ? ? ? ?// ? ? 隨機(jī)值 ? ? ?原因同上
printf("%d\n", strlen(*arr)); ? ? ? ? ? ? // ? ? 程序錯(cuò)誤 ? *arr是個(gè)值
printf("%d\n", strlen(arr[1])); ? ? ? ? ?// ? ? 程序錯(cuò)誤 ? ?原因同上
printf("%d\n", strlen(&arr)); ? ? ? ? ? // ? ? 隨機(jī)值
printf("%d\n", strlen(&arr + 1)); ? ? // ? ? 隨機(jī)值
printf("%d\n", strlen(&arr[0] + 1)); // ? ? 隨機(jī)值
?
char arr[] = "abcdef";?
printf("%d\n", sizeof(arr));? ? ? ? ? ? ? ? ?// 7 ? ? ?arr[]={{a},{b},{c},ozvdkddzhkzd,{e},{f},{\0}};
printf("%d\n", sizeof(arr + 0)); ? ? ? ? ? // 4 ? ? ?
printf("%d\n", sizeof(*arr)); ? ? ? ? ? ? ? ?// 1 ? ? ?
printf("%d\n", sizeof(arr[1])); ? ? ? ? ? ? // 1
printf("%d\n", sizeof(&arr)); ? ? ? ? ? ? ?// ?4
printf("%d\n", sizeof(&arr + 1)); ? ? ? ?// 4
printf("%d\n", sizeof(&arr[0] + 1)); ? ?// 4
?
printf("%d\n", strlen(arr)); ? ? ? ? ? ? ? ? ? // 6 ? ? ? ? ? ? ? ? 雖然字符串最后有‘\0’,strlen求長度不算'\0'
printf("%d\n", strlen(arr + 0)); ? ? ? ? ? ?// ?6
printf("%d\n", strlen(*arr)); ? ? ? ? ? ? ? ?// ? 程序錯(cuò)誤
printf("%d\n", strlen(arr[1])); ? ? ? ? ? ? // ? 程序錯(cuò)誤
printf("%d\n", strlen(&arr)); ? ? ? ? ? ? ??// ? 6
printf("%d\n", strlen(&arr + 1)); ? ? ? ?// ? ?隨機(jī)值 ? ? ? ?跳過這個(gè)數(shù)組開始計(jì)算,不知道什么時(shí)候會(huì)碰到‘\0’
printf("%d\n", strlen(&arr[0] + 1)); ? ?// ? 5 ? ? ? ? ? ? ? ? 從第二個(gè)元素地址開始( 6 - 1 = 5 )
?
?
char *p = "abcdef";?
printf("%d\n", sizeof(p)); ? ? ? ? ? ? ? ? // 4 ? ? ?p是個(gè)指針變量,4個(gè)字節(jié)
printf("%d\n", sizeof(p + 1)); ? ? ? ? ?// ?4 ? ? ?p+1存的第二個(gè)元素的地址,4個(gè)字節(jié)
printf("%d\n", sizeof(*p)); ? ? ? ? ? ? ? // ?1 ? ? ?首元素
printf("%d\n", sizeof(p[0])); ? ? ? ? ? ?// ?1 ? ? ?
printf("%d\n", sizeof(&p)); ? ? ? ? ? ? ?// ?4 ? ??指針變量地址
printf("%d\n", sizeof(&p + 1)); ? ? ??// ?4 ? ? ?p的地址的下一個(gè)地址,與數(shù)組無關(guān)了
printf("%d\n", sizeof(&p[0] + 1)); ? // ?4 ? ??第二個(gè)元素的地址
?
printf("%d\n", strlen(p)); ? ? ? ? ? ? ? ? // ?6
printf("%d\n", strlen(p + 1)); ? ? ? ? ?// ? 5
printf("%d\n", strlen(*p)); ? ? ? ? ? ? ? // ? 程序錯(cuò)誤
printf("%d\n", strlen(p[0])); ? ? ? ? ? ?// ? 程序錯(cuò)誤
printf("%d\n", strlen(&p)); ? ? ? ? ? ??// ? 隨機(jī)值 ? ? 從p的地址開始數(shù),不知道后面的情況
printf("%d\n", strlen(&p + 1)); ? ? ? // ?隨機(jī)值
printf("%d\n", strlen(&p[0] + 1)); ? // ?5
?
二維數(shù)組
int a[3][4] = { 0 };
printf("%d\n", sizeof(a)); ? ? ? ? ? ? ? ??// ?48
printf("%d\n", sizeof(a[0][0])); ? ? ? ?// ?4
printf("%d\n", sizeof(a[0])); ? ? ? ? ? ?// ?16 ? 相當(dāng)于第一行的數(shù)組名
printf("%d\n", sizeof(a[0] + 1)); ? ? ?// ?4 ? ? a[0]相當(dāng)于第一行的數(shù)組名,它不單獨(dú)在sizeof() 內(nèi),所以a[0]降級(jí)為第一行第一個(gè)元素,a[0]+1則表示為第一行第二個(gè)元素地址
printf("%d\n", sizeof(a + 1)); ? ? ? ? ?// ? 4 ? ?a不單獨(dú)在sizeof() 內(nèi),二維數(shù)組 a 降級(jí)為一維數(shù)組 ,即第一行地址,+1就是第二行的地址(不是第二行第一個(gè)元素的地址)
printf("%d\n", sizeof(&a[0] + 1)); ??// ? 4 ? ?第二行的地址
printf("%d\n", sizeof(*a)); ? ? ? ? ? ? ??// ? 16 ??a不單獨(dú)在sizeof() 內(nèi),二維數(shù)組 a 降級(jí)為一維數(shù)組 ,即第一行地址
printf("%d\n", sizeof(a[3])); ? ? ? ? ???// ? 16 ? sizeof內(nèi)部不參與運(yùn)算,我們可以根據(jù)a[3]這個(gè)表達(dá)式推測(cè)出它和a[0]的類型是一樣的,所以無論a[ ]中是多少,它的大小都是16 ? ?(sizeof(int)是4,int是個(gè)類型)?
總結(jié)
以上是生活随笔為你收集整理的有关数组的运算 (sizeof)(strlen)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二维数组中的一些问题
- 下一篇: 程序环境——翻译环境与执行环境