【C指针】深入理解指针(最终篇)数组&&指针&&指针运算题解析(一)1:https://developer.aliyun.com/article/1474744
细解:
- printf(“%d\n”, sizeof(arr)); //6
sizeof
中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩,单位是字节.,6个字节 - printf(“%d\n”, sizeof(arr + 0));// 4/8
arr+0
是数组第一个元素的地址,是地址,大小就是4/8个字节 - printf(“%d\n”, sizeof(* arr));// 1*
*arr
是首元素,计算的是首元素的大小,字符a
的类型是char
,是1个字节 - printf(“%d\n”, sizeof(arr[1]));// 1
arr[1]
是第二个元素字符b
,类型是char
是1个字节 - printf(“%d\n”, sizeof(&arr));//4/8
&arr
取得是整个数组的地址,是地址,大小就是4/8个字节。 - printf(“%d\n”, sizeof(&arr + 1));//4/8
&arr
取得是整个数组的地址,&arr+1跳
过整个数组,跳过了6个数组的元素,指向f后面,也是地址,大小就是4/8个字节。
🎈🎈🎈strlen
计算字符数组
int main() { char arr[] = { 'a','b','c','d','e','f' }; 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)); }
rintf(“%d\n”, strlen(arr));//随机值
arr
为数组名,也就是数组首元素的地址,但是字符数组中没有\0
,strlen
将会继续查找\0
,但是\0
是不知道在什么位置出现,所以无法计算,为随机值。
printf(“%d\n”, strlen(arr + 0));//随机值
arr+0也是数组首元素的地址,但是字符数组中没有\0,strlen将会继续查找\0,但是\0是不知道在什么位置出现,所以无法计算,为随机值。并且与前面的随机值一样
- printf(“%d\n”, strlen(*arr));//非法访问
//'a'-97 //printf("%d\n", strlen(*arr));//err // //'b'-98 //printf("%d\n", strlen(arr[1]));//err
注意
*arr取出来的是字符a,字符a对应的ASCII码值为97,而97为内存空间里的一个地址,
size_t strlen ( const char * str );,内存空间这块97地址传给strlen,strlen能直接访问这块不属于他的空间吗?
答案是不可以,因为它不属于strlen的作用域==一旦访问了就成非法访问了。(当然,arr[1]也是如此)
printf(“%d\n”, strlen(arr[1]));//非法访问
注意
*arr1[1]取出来的是字符b,字符a对应的ASCII码值为98,而98为内存空间里的一个地址,
size_t strlen ( const char * str );,内存空间这块97地址传给strlen,strlen能直接访问这块不属于他的空间吗?
答案是不可以,因为它不属于strlen的作用域一旦访问了就成非法访问了,编译器就会报错–>访问冲突。
printf(“%d\n”, strlen(&arr));//随机值
&arr虽然是数组的地址,但是也是指向数组的起始位置,那就是从数组首元素开始找嘛,没有\0,找不到,那就是随机值了
printf(“%zd\n”, strlen(&arr + 1));//随机值-6
&arr+1跳过整个数组,也就是跳过6个char类型的元素从f后面的地址开始查找\0,因此相比从头开始找少了6个元素
printf(“%d\n”, strlen(&arr[0] + 1));//随机值-1
&a[0] + 1 是第二个元素的地址,比随机值少一个元素a
字符串数组
💮 💮 sizeof
计算字符串
数组
int main() { char arr[] = "abcdef"; printf("%zd\n", sizeof(arr)); printf("%zd\n", sizeof(arr + 0)); printf("%zd\n", sizeof(*arr)); printf("%zd\n", sizeof(arr[1])); printf("%zd\n", sizeof(&arr)); printf("%zd\n", sizeof(&arr + 1)); printf("%zd\n", sizeof(&arr[0] + 1)); return 0; }
解析:char arr[] = “abcdef\0”//字符串别忘记有\0,也占用一个char空间printf(“%zd\n”, sizeof(arr));//7
数组名arr单独放,计算的是整个数组的大小,7个字节
printf(“%zd\n”, sizeof(arr + 0));//4/8
arr+0是数组首元素的地址,地址的大小是4/8个字节
printf(“%zd\n”, sizeof(*arr));//1
*arr是数组的首元素,这里计算的是首元素(a)的大小 ,类型为char,大小为1
printf(“%zd\n”, sizeof(arr[1]));//1
*arr是数组的首元素,这里计算的是第二个元素(b)的大小 ,大小为1
printf(“%zd\n”, sizeof(&arr));//4/8
&arr - 是数组的地址,数组的地址也是地址,是地址就是4/8个字节
printf(“%zd\n”, sizeof(&arr + 1));//4/8
&arr+1,跳过整个数组,指向了数组的后边,4/8
printf(“%zd\n”, sizeof(&arr[0] + 1));//4/8
&arr[0] + 1是第二个元素的地址 是地址,那就是4/8
小结
sizeof计算变量或类型的大小,单位是字节(byte)。%zd格式说明符用于打印size_t类型的值,这也是sizeof的返回类型。
字符串常量"abcdef"实际上是一个char数组,最后一个元素是'\0'。所以sizeof(arr)算出的是整个字符串占用的空间,包含结束符,即7个字节。
当sizeof操作数是数组时,它计算的是整个数组占用的字节数。当操作数是指针时,它计算的是指针变量本身占用的字节数,与它指向的对象大小无关。
【C指针】深入理解指针(最终篇)数组&&指针&&指针运算题解析(一)3:https://developer.aliyun.com/article/1474746