关于数组方面的大小计算

来源:互联网 发布:如何做免费网络推广 编辑:程序博客网 时间:2024/06/05 02:15

在这些问题的核心是:只有数组名单独在sizeof内部时,才代表整个数组,别的地方数组名一般都代表数组首元素地址,&+数组名,代表整个数组。

#include <stdio.h>#include <stdlib.h>int main(){int a[] = { 1, 2, 3, 4 };printf("%d\n", sizeof(a));//   数组名a单独放在sizeof中代表整个数组  即 4*4=16printf("%d\n", sizeof(a + 0)); //   数组a不是单独放在sizeof中代表数组首元素地址  即 在32位平台为:4    64位平台为:8printf("%d\n", sizeof(*a));// 数组a不是单独放在sizeof中代表数组首元素地址,解引用 即a[0]一个整型的大小:   4printf("%d\n", sizeof(a + 1));// 数组a不是单独放在sizeof中代表数组首元素地址, 即a[1]的地址  即 在32位平台为:4    64位平台为:8printf("%d\n", sizeof(a[1]));//  相当于元素 2    一个整型的大小:   4printf("%d\n", sizeof(&a));//    取地址a,相当于整个数组的地址 但它还是地址 即  在32位平台为:4    64位平台为:8printf("%d\n", sizeof(&a + 1));//   取地址a,相当于整个数组的地址 但它还是地址 &a+1就是下一个数组的地址  即  在32位平台为:4    64位平台为:8printf("%d\n", sizeof(&a[0]));//    取元素的首地址  但它还是地址   即 在32位平台为:4    64位平台为:8printf("%d\n", sizeof(&a[0] + 1));//  相当于第二元素地址  即 在32位平台为:4    64位平台为:8system("pause");return 0;}


#include <stdio.h>#include <stdlib.h>int main(){char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };printf("%d\n", sizeof(arr));// 数组名a单独放在sizeof中代表整个数组 即 为6个字符型 6;printf("%d\n", sizeof(arr + 0));//   数组arr不是单独放在sizeof中代表数组首元素地址,arr+0就是首元素地址    即 在32位平台为:4    64位平台为:8printf("%d\n", sizeof(*arr));//   数组arr不是单独放在sizeof中代表数组首元素地址,解引用相当于'a',即 大小为1;printf("%d\n", sizeof(arr[1]));// 相当于'b',即 大小为 1;printf("%d\n", sizeof(&arr));// 取地址arr,相当于整个数组的地址 但它还是地址 即  在32位平台为:4    64位平台为:8printf("%d\n", sizeof(&arr + 1)); //  取地址arr,相当于整个数组的地址 但它还是地址 &arr + 1就是下一个数组的地址  即  在32位平台为:4    64位平台为:8printf("%d\n", sizeof(&arr[0] + 1)); // 相当于第二元素地址  即 在32位平台为:4    64位平台为:8printf("%d\n", strlen(arr));//     数组名代表首元素地址 ,strlen 需要'\0'来结束,但是由于数组没有‘\0’,可能会越界访问程序出错;printf("%d\n", strlen(arr + 0));// 同上printf("%d\n", strlen(*arr));// 相当于字符'a',而strlen参数为一个地址所以可能会出错;printf("%d\n", strlen(arr[1]));// 同上printf("%d\n", strlen(&arr));// 取地址arr,相当于整个数组的地址  strlen 找下一个数组地址一直到'\0';printf("%d\n", strlen(&arr + 1));// 比上面少找一个数组,从arr后面的数组开始找;printf("%d\n", strlen(&arr[0] + 1));// 相当于从arr第二个元素地址开始找一直到'\0';system("pause");return 0;}





#include <stdio.h>#include <stdlib.h>int main(){char *p = "abcdef";printf("%d\n", sizeof(p));  // p是一个地址 即  在32位平台为:4    64位平台为:8printf("%d\n", sizeof(p + 1));// 依然是一个地址 即  在32位平台为:4    64位平台为:8printf("%d\n", sizeof(*p));// 相当于'a' 大小 即 1printf("%d\n", sizeof(p[0]));// 相当于'a'的大小 即 1printf("%d\n", sizeof(&p));// 相当于p的地址 即  在32位平台为:4    64位平台为:8printf("%d\n", sizeof(&p + 1)); // 下一个char*类型的指针的地址 即  在32位平台为:4    64位平台为:8printf("%d\n", sizeof(&p[0] + 1));// 相当于b的地址  即  在32位平台为:4    64位平台为:8;printf("%d\n", strlen(p));//即 从a的地址开始  6;printf("%d\n", strlen(p + 1)); //即 从b的地址开始   5;printf("%d\n", strlen(*p));//*p代表'a'不是个地址,会出错printf("%d\n", strlen(&p));//  即 从p的地址开始找,直到'\0'printf("%d\n", strlen(&p + 1));// 即 从p的地址的下一个地址开始找,直到'\0'printf("%d\n", strlen(&p[0] + 1));// 即 'b'的地址开始找 即 5system("pause");return 0;}


#include <stdio.h>#include <stdlib.h>int main(){int a[3][4] = { 0 };printf("%d\n", sizeof(a));//  代表整个数组 即 3*4*4 = 48printf("%d\n", sizeof(a[0][0]));// 即第一个元素大小 4printf("%d\n", sizeof(a[0]));//  即第一行的大小 4*4=16printf("%d\n", sizeof(a[0] + 1));// 即 第一行的第二个元素地址 在32位平台为:4    64位平台为:8printf("%d\n", sizeof(a + 1));//即 第二行的地址 在32位平台为:4    64位平台为:8printf("%d\n", sizeof(&a[0] + 1));//  即 第2个元素的地址 在32位平台为:4    64位平台为:8printf("%d\n", sizeof(*a));// 即第一行的大小 4*4=16printf("%d\n", sizeof(a[3]));//  即 相当于第四行的大小 sizeof的括号内部不需要计算  16system("pause");return 0;}




原创粉丝点击