深入理解C语言指针——挑战C指针笔试题(8)

42 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情 题目

//字符数组
char arr[] = {'a','b','c','d','e','f'};
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));
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));
char *p = "abcdef";
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p+1));
printf("%d\n", sizeof(*p));
printf("%d\n", sizeof(p[0]));
printf("%d\n", sizeof(&p));
printf("%d\n", sizeof(&p+1));
printf("%d\n", sizeof(&p[0]+1));
printf("%d\n", strlen(p));
printf("%d\n", strlen(p+1));
printf("%d\n", strlen(*p));
printf("%d\n", strlen(p[0]));
printf("%d\n", strlen(&p));
printf("%d\n", strlen(&p+1));
printf("%d\n", strlen(&p[0]+1));

解析

//字符数组
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));// 6
//sizeof数组名,就是整个数组 数组大小为6
printf("%d\n", sizeof(arr+0));// 4/8
//arr+0,数组名就是首元素地址,arr+0也是首元素地址
//指针大小4/8
printf("%d\n", sizeof(*arr));// 1
//解引用数组名,此时的数组名代表首元素地址,
//解引用后得到第一个元素,元素大小1
printf("%d\n", sizeof(arr[1]));// 1
//arr[1]表示第一个元素,元素大小1
printf("%d\n", sizeof(&arr));// 4/8
//&数组名,代表数组地址,指针大小4/8
printf("%d\n", sizeof(&arr+1));
//&arr 数组地址,&arr+1也是数组地址
//而指针变量大小4/8
printf("%d\n", sizeof(&arr[0]+1));// 4/8
//&arr[0]第一个元素地址,&arr[0]+1第二个元素地址
printf("%d\n", strlen(arr));//随机值
//stlen函数遇到'\0'停止计数
printf("%d\n", strlen(arr+0));// 随机值
//同上
printf("%d\n", strlen(*arr));// 报错 
// stlen函数参数接收的是指针,*arr是第一个元素
printf("%d\n", strlen(arr[1]));//报错
//同上
printf("%d\n", strlen(&arr));// 随机值
//&arr数组的地址,遇到'\0'停止计数
printf("%d\n", strlen(&arr+1));// 随机值—6
//&arr+1 整个数组的地址加一跳过,数组大小 
//而数组大小为6个字节,所以长度为随机值-6
printf("%d\n", strlen(&arr[0]+1));//随机值-1
//&arr[0]+1得到数组第二个元素地址,从第一个元素计数
//计数结果为随机值,故从第二个为随机值-1

在这里插入图片描述在这里插入图片描述

char arr[] = "abcdef";
//字符串数组,数组大小要加上'\0'
printf("%d\n", sizeof(arr)); // 7
//sizeof arr arr表示整个数组
printf("%d\n", sizeof(arr+0));// 4/8
//首元素地址加0还是首元素地址,指针大小为4/8
printf("%d\n", sizeof(*arr));// 1
//*arr得到第一个元素,元素大小为 1bit
printf("%d\n", sizeof(arr[1]));// 1
//同上
printf("%d\n", sizeof(&arr)); // 4/8
//&arr整个数组的地址,指针大小4/8
printf("%d\n", sizeof(&arr+1));// 4/8
//&arr+1数组指针,指针大小4/8
printf("%d\n", sizeof(&arr[0]+1));// 4/8
//&arr[0]第一个元素地址,&arr[0]+1第二个元素地址
//而指针大小4/8
printf("%d\n", strlen(arr));// 6
//arr数组存到是字符串,字符串中含有'\0'
printf("%d\n", strlen(arr+0));// 6
// 同上
printf("%d\n", strlen(*arr));// 报错
//*arr得到首元素,而strlen函数参数为指针类型
printf("%d\n", strlen(arr[1]));// 报错
//同上
printf("%d\n", strlen(&arr));// 6
// &arr得到整个数组地址
printf("%d\n", strlen(&arr+1));// 随机值
//&arr+1跳过整个数组
printf("%d\n", strlen(&arr[0]+1));// 5
//&arr[0]+1得到第二个元素地址

在这里插入图片描述 在这里插入图片描述