sizeof与strlen的用法解读

来源:互联网 发布:第三方数据公司 编辑:程序博客网 时间:2024/04/30 03:04
sizeof(数组名),这里数组名表示“整个数组”。
sizeof(数组名+0),这里数组名(只要不是单独出现)表示数组首元素的“地址”
sizeof(*数组名),这里数组名表示数组“首元素的地址”
sizeof求字符串时要算上\0。

strlen(abc def):字符串为"abc def"其后系统自动补上'\0';而求字符串长度的函数strlen()只要遇见'\0';就返回函数值!而且'\0'不算在其中!故返回值为7(空格也算一个字符!)
strlen(abc\0def):strlen函数遇到'\0'即结束,故返回值为:3
strlen()求的是地址(就是能包含该类型多少)的长度

(*数组名)求得都是首地址

char p[4] = "abcd"; //给定字符串下标,其后无\0printf("%d\n",sizeof(p));// 4printf("%d\n",strlen(p)); //11
char p[] = "abcd";//未给定字符串下标,其后系统自动补上\0printf("%d\n",sizeof(p)); //5printf("%d\n",strlen(p)); //4

//一维数组int a[] = {1,2,3,4};printf("%d\n",sizeof(a)); //16        整个数组的大小printf("%d\n",sizeof(a+0)); //4       数组的首元素1的地址大小printf("%d\n",sizeof(*a)); //4        数组首元素1的大小printf("%d\n",sizeof(a+1)); //4       数组的第二个元素2的地址大小printf("%d\n",sizeof(a[1])); //4      数组第二个元素的大小 printf("%d\n",sizeof(&a)); //4        整个一维数组地址的地址大小printf("%d\n",sizeof(&a+1)); //4      整个一维数组地址(数组外)的下一地址大小printf("%d\n",sizeof(&a[0])); //4     数组第一个元素1的地址大小printf("%d\n",sizeof(&a[0]+1)); //4   数组第二个元素2的地址大小
//字符数组 char arr[] = {'a','b','c','d','e','f'};printf("%d\n", sizeof(arr)); //6          整个数组的大小printf("%d\n", sizeof(arr+0)); //4        数组的首元素'a'的地址大小    printf("%d\n", sizeof(*arr)); //1         数组首元素'a'的大小printf("%d\n", sizeof(arr[1])); //1       数组第二个'b'的大小printf("%d\n", sizeof(&arr)); //4         整个字符数组地址的地址大小printf("%d\n", sizeof(&arr+1)); //4       整个字符数组地址(数组外)的下一地址大小printf("%d\n", sizeof(&arr[0]+1)); //4    数组第二个元素'b'的地址大小
printf("%d\n", strlen(arr)); //19         数组后出现\0为止的长度(随机值)printf("%d\n", strlen(arr+0)); //19       数组后出现\0为止的长度(随机值)//printf("%d\n", strlen(*arr)); //err       错误,*arr为首元素'a',strlen是按(该类型变量的长度)"地址"求取长度//printf("%d\n", strlen(arr[1])); //err     错误,arr[1]为元素'b',strlen是按(该类型变量的长度)"地址"求取长度printf("%d\n", strlen(&arr)); //19        有警告,整个数组地址到出现\0为止的长度(随机值)printf("%d\n", strlen(&arr+1)); //13      有警告,从整个数组地址(数组外)的下一个地址开始出现\0为止的长度(随机值)printf("%d\n", strlen(&arr[0]+1)); //18   取数组第二个元素到出现\0为止的长度(随机值)
char *p = "abcdef"; printf("%d\n", sizeof(p)); //4         指针变量p的大小printf("%d\n", sizeof(p+1)); //4       指针变量p的下一地址的大小printf("%d\n", sizeof(*p)); //1        字符串首字符a的大小  printf("%d\n", sizeof(p[0])); //1      字符串首字符a的大小printf("%d\n", sizeof(&p)); //4        存放指针变量p的地址的大小printf("%d\n", sizeof(&p+1)); //4      存放指针变量p的下一个地址的大小printf("%d\n", sizeof(&p[0]+1)); //4   字符串中字符b的地址大小
 printf("%d\n", strlen(p)); //6         整个字符串的长度(按字符类的地址的长度)printf("%d\n", strlen(p+1)); //5       从第二个字符开始的字符串的长度(按字符类的地址的长度)printf("%d\n", strlen(*p)); //err      错误,*p为字符'a',strlen是求地址长度,程序崩溃printf("%d\n", strlen(p[0])); //err    错误,p[0]为字符'a',strlen是求地址长度,程序崩溃printf("%d\n", strlen(&p)); //3        有警告,二级指针,生成随机数printf("%d\n", strlen(&p+1)); //11     有警告,二级指针,生成随机数printf("%d\n", strlen(&p[0])); //6     从字符串首地址到字符串结束(\0),字符串长度printf("%d\n", strlen(&p[0]+1)); //5   从字符串第二个字符地址到字符串结束(\0),字符串长度
//二维数组 int a[3][4] = {0}; printf("%d\n",sizeof(a)); //48         整个二维数组的大小printf("%d\n",sizeof(a[0][0])); // 4   元素a[0][0]的大小printf("%d\n",sizeof(a[0])); //16      第一行(a[0][0],a[0][1],a[0][2])的元素的大小printf("%d\n",sizeof(a[0]+1)); //4     第一行的下一个元素a[1][0]的大小printf("%d\n",sizeof(a+1)); //4        首地址的下一个元素a[0][1]的地址大小printf("%d\n",sizeof(&a[0]+1)); //4    第一行a[0]下一地址的大小(a[0][1]的地址大小)printf("%d\n",sizeof(*a)); //16        第一行元素的地址大小(n维数组可以看做是n-1个元素的一维数组,所以*a是以a[0]为数组名的一维数组)printf("%d\n",sizeof(a[3])); //16      数组外的类a型的地址大小

1 0
原创粉丝点击