C语言的指针是个神奇的存在,让你充分感受到算法之美。c语言是靠数据结构、算法的分析和设计过程中的一门基础课,所以从问题出发能更加深入了解指针。
在 C 语言中,sizeof() 是一个判断数据类型或者表达式长度的运算符;
strlen()是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值(长度不包含’\0’)
观察输出结果:
char arr[] = "abcdef";
printf("%d\n",sizeof(arr));
printf("%d\n",sizeof(arr + 0));
printf("%d\n",sizeof(*arr));
printf("%d\n",sizeof(arr[1]));
printf("%d\n",sizeof(&arr));
printf("%d\n",sizeof(&arr + 1));
printf("%d\n",sizeof(&arr[0] + 1));
printf("%d\n",strlen(arr));
printf("%d\n",strlen(arr + 0));
printf("%d\n",strlen(*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));
你能否说出每个输出的区别和输出的结果呢
分析:
sizeof(arr)//计算的数组的大小,单位是字节:7
sizeof(arr + 0);//计算的是地址的大小 -arr + 0是首元素的地址
sizeof(*arr)//1 *arr是首元素,sizeof(*arr)计算首元素的大小
sizeof(arr[1])//1 arr[1]是第二个元素,sizeof(arr[1])计算的是第二个元素的大小
sizeof(&arr)// 4/8 &arr虽然是数组的地址,但也是地址,所以是4/8个字节
sizeof(&arr + 1)// 4/8 &arr+1是跳过整个数组后的地址,但也是地址
sizeof(&arr[0] + 1)// 4/8 &arr[0]+1 第二个元素的地址
strlen(arr)//6 个字节
strlen(arr + 0)//6个字节
strlen(*arr)//error
strlen(arr[1])//error
strlen(&arr)//&arr - 数组的地址 - 数组指针 cahr(*p)[7] = &arr;
strlen(&arr + 1)//6个字节
strlen(arr[0] + 1)//随机值
char arr[] = "abcdef";
printf("%d\n",sizeof(arr));//计算的数组的大小,单位是字节:7
printf("%d\n",sizeof(arr + 0));//计算的是地址的大小 -arr + 0是首元素的地址
printf("%d\n",sizeof(*arr));//1 *arr是首元素,sizeof(*arr)计算首元素的大小
printf("%d\n",sizeof(arr[1]));//1 arr[1]是第二个元素,sizeof(arr[1])计算的是第二个元素的大小
printf("%d\n",sizeof(&arr));// 4/8 &arr虽然是数组的地址,但也是地址,所以是4/8个字节
printf("%d\n",sizeof(&arr + 1));// 4/8 &arr+1是跳过整个数组后的地址,但也是地址
printf("%d\n",sizeof(&arr[0] + 1));// 4/8 &arr[0]+1 第二个元素的地址
printf("%d\n",strlen(arr));//6
printf("%d\n",strlen(arr + 0));//6
printf("%d\n",strlen(*arr));//error
printf("%d\n",strlen(arr[1]));//error
printf("%d\n",strlen(&arr));//&arr - 数组的地址 - 数组指针 cahr(*p)[7] = &arr;
printf("%d\n",strlen(&arr + 1));//6
printf("%d\n",strlen(arr[0] + 1));//随机值