bilibiliclass36-40_C语言_指针的进阶_指针和数组笔试题解析

指针和数组笔试题解析

本章总结

数组名的意义:
sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
除此之外所有的数组名都表示首元素的地址。

一维数组

整形数组

int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a+0));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(a[1]));
printf("%d\n",sizeof(&a));
printf("%d\n",sizeof(*&a));
printf("%d\n",sizeof(&a+1));
printf("%d\n",sizeof(&a[0]));
printf("%d\n",sizeof(&a[0]+1));

解析:
 

//地址字节数:
//win32:4
//win64:8
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));
//sizeof(数组名)-计算的是整个数组的大小-单位字节
//16
printf("%d\n",sizeof(a+0));
//数组名是首元素的地址
//1.sizeof(数组名)-计算的是整个数组的大小
//2.&数组名-数组名表示的是整个数组
//这里的a+0还是首元素的地址
//4/8
printf("%d\n",sizeof(*a));
//*首元素的地址=首元素的大小
//4
printf("%d\n",sizeof(a+1));
//第二个元素的地址
//4/8
printf("%d\n",sizeof(a[1]));
//第二个元素的大小=整形大小=int=4字节
//4
printf("%d\n",sizeof(&a));
//&a取出数组的地址
//地址的大小为4
//4/8
printf("%d\n",sizeof(*&a));
//&a取出数组的地址
//*&a访问数组==a
//16
printf("%d\n",sizeof(&a+1));
//&a是一个数组的地址
//&a+1虽然地址跳过一个数组的地址,但还是一个地址
//4/8
printf("%d\n",sizeof(&a[0]));
//第一个元素的地址
//4/8
printf("%d\n",sizeof(&a[0]+1));
//第二个元素的地址
//4/8

字符数组
 

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[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
//sizeof计算的是数组的大小,6*1=6
//6
printf("%d\n", sizeof(arr+0));
//arr首元素的地址,arr+0也还是首元素的地址
//4/8
printf("%d\n", sizeof(*arr));
//arr是首元素的地址,*arr是首元素
//1
printf("%d\n", sizeof(arr[1]));
//arr[1]是第二个元素
//1
printf("%d\n", sizeof(&arr));
//数组的地址还是地址
//4/8
printf("%d\n", sizeof(&arr+1));
//地址1+1=地址2
//地址大小为4/8
//4/8
printf("%d\n", sizeof(&arr[0]+1));
//第二个元素的地址
//4/8


字符数组
 

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));

解析:
 

char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));
//strlen找到'\0'才停止
//随机值
printf("%d\n", strlen(arr+0));
//随机值
printf("%d\n", strlen(*arr));
//strlen要地址
//ASCII码中'a'=97
//读取0x00000061的地址然后向后非法读取
//代码错误
printf("%d\n", strlen(arr[1]));
//strlen要地址
//ASCII码中'b'=98
//读取98的地址然后向后非法读取
//代码错误
printf("%d\n", strlen(&arr));
//&arr是首元素的地址,也是'a'的地址
//随机值
printf("%d\n", strlen(&arr+1));
//&arr+1跳过数组的地址向后走
//随机值
printf("%d\n", strlen(&arr[0]+1));
//从b开始向后找'\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));

解析:
 

char arr[] = "abcdef";
//'a' 'b' 'c' 'd' 'e' 'f' '\0'
printf("%d\n", sizeof(arr));
//sizeof计算的是整个空间的大小,strlen整个空间的大小-1('\0')
//sizeof计算的是数组的大小,7*1=7
//7
printf("%d\n", sizeof(arr+0));
//地址
//4/8
printf("%d\n", sizeof(*arr));
//'a'的大小
//1
printf("%d\n", sizeof(arr[1]));
//'b'的大小
//1
printf("%d\n", sizeof(&arr));
//地址
//4/8
printf("%d\n", sizeof(&arr+1));
//地址
//4/8
printf("%d\n", sizeof(&arr[0]+1));
//地址
//4/8

 

字符数组

char arr[] = “abcdef”;
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", strlen(arr));
//'a' 'b' 'c' 'd' 'e' 'f' '\0'
//strlen不算'\0'
//6
printf("%d\n", strlen(arr+0));
//首元素地址
//从首元素地址向后数
//6
printf("%d\n", strlen(*arr));
//strlen接受的是地址const char* str
//*arr是'a'ASCII码为97
//地址为97==0x00000061发生访问错误
//err
printf("%d\n", strlen(arr[1]));
//err
printf("%d\n", strlen(&arr));
//warning:const char和char(*)[7]的类型不同
//&arr是数组的地址-数组指针-char(*)[7]
//6
printf("%d\n", strlen(&arr+1));
//warning:const char和char(*)[7]的类型不同
//随机值
printf("%d\n", strlen(&arr[0]+1));
//'b'向后读取
//5

 

字符数组

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));

解析:
 

char *p = “abcdef”;
//p存放"abcdef"的地址
printf("%d\n", sizeof(p));
//地址
//计算指针变量的大小
//4/8
printf("%d\n", sizeof(p+1));
//p存的是'a'的地址
//p+1是'b'的地址
//4/8
printf("%d\n", sizeof(*p));
//*p=首元素
//'a'
//1
printf("%d\n", sizeof(p[0]));
//int arr[10];arr[0] == *(arr+0)
//p[0] == *(p+0) == 'a'
//1
printf("%d\n", sizeof(&p));
//地址
//4/8
printf("%d\n", sizeof(&p+1));
//地址
//4/8
printf("%d\n", sizeof(&p[0]+1));
//'b'的地址
//4/8

 

字符数组

char *p = “abcdef”;
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 *p = “abcdef”;
printf("%d\n", strlen(p));
//p的地址传过去='a'的地址
//6
printf("%d\n", strlen(p+1));
//5
printf("%d\n", strlen(*p));
//err
printf("%d\n", strlen(p[0]));
//err
printf("%d\n", strlen(&p));
//a b c d e f \0
//取p的地址向后读
//地址不可知
//随机值
printf("%d\n", strlen(&p+1));
//随机值
printf("%d\n", strlen(&p[0]+1));
//'b'的地址
//5

 

二维数组


int a[3][4] = {0};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a[0][0]));
printf("%d\n",sizeof(a[0]));
printf("%d\n",sizeof(a[0]+1));
printf("%d\n",sizeof((a[0]+1)));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof((a+1)));
printf("%d\n",sizeof(&a[0]+1));
printf("%d\n",sizeof(*(&a[0]+1)));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a[3]));

解析:
 

//二维数组
int a[3][4] = {0};
printf("%d\n",sizeof(a));
//数组总大小
//48
printf("%d\n",sizeof(a[0][0]));
//一个整形元素的大小
//4
printf("%d\n",sizeof(a[0]));
//a[0]相当于第一行作为一维数组的数组名
//sizeof(数组名)=第一行的数组的大小
//16
printf("%d\n",sizeof(a[0]+1));
//a[0]相当于第一行作为一维数组的数组名 == 第一行第一个元素的地址
//a[0]+1第一行第二个元素的地址
//4/8
printf("%d\n",sizeof(*(a[0]+1)));
//4
printf("%d\n",sizeof(a+1));
//二维数组看成一维数组
//二维数组的首元素是他第一行
//a == 第一行的地址
//a+1 ==第二行的地址
//4/8
printf("%d\n",sizeof(*(a+1)));
//a+1 ==第二行的地址
//计算第二行的大小
//16
printf("%d\n",sizeof(&a[0]+1));
//第二行的地址
//4/8
printf("%d\n",sizeof(*(&a[0]+1)));
//第二个行的大小
//16
printf("%d\n",sizeof(*a));
//a是首元素的地址 == 第一行的地址
//16
printf("%d\n",sizeof(a[3]));
//sizeof不会访问()内的内容,不参加真实运算,只会通过括号内的类型判断大小
//16

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值