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