指针和数组的练习

首先做这些练习前我们要明白 数组名的意义:

1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节。

2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。

3. 除此之外所有的数组名都表示首元素地址。而地址的大小都是4(32为平台)/8(64位平台)个字节。

ps:本篇为32位平台下运行结果

一维数组:

int a[] = {1,2,3,4};

printf("%d\n",sizeof(a));  //16
属于第1种情况,表示整个数组的大小,为16个字节

printf("%d\n",sizeof(a+0));  //4
表示首元素地址,大小为4个字节

printf("%d\n",sizeof(*a));   //4
首元素地址解引用,表示首元素,大小为4个字节

printf("%d\n",sizeof(a+1));  //4
表示首元素地址+1,即第二个元素地址,大小为4个字节

printf("%d\n",sizeof(a[1]));  //4
表示第二个元素,大小为4个字节

printf("%d\n",sizeof(&a));   //4
表示整个数组的地址,大小为4个字节

printf("%d\n",sizeof(*&a));   //16
对数组的地址解引用,表示整个数组的大小,为16个字节

printf("%d\n",sizeof(&a+1));  //4
表示跳过整个数组的下一个数组的地址,大小为4个字节

printf("%d\n",sizeof(&a[0]));  //4
表示首元素地址,大小为4个字节

printf("%d\n",sizeof(&a[0]+1));  //4
表示首元素地址+1,即第二个元素地址,大小为4个字节

字符数组

char arr[] = {'a','b','c','d','e','f'};  (没有 \0字符)

printf("%d\n", sizeof(arr));  //6
表示6个字节,有6个元素

printf("%d\n", sizeof(arr+0));   //4
表示首元素地址,大小为4个字节

printf("%d\n", sizeof(*arr)); //1
首元素地址解引用,表示首元素,大小为1个字节

printf("%d\n", sizeof(arr[1])); //1
表示第二个元素,大小为1个字节

printf("%d\n", sizeof(&arr)); //4
表示取数组的地址,大小为4个字节

printf("%d\n", sizeof(&arr+1)); //4
表示跳过一个数组下一个数组的地址,大小为4个字节

printf("%d\n", sizeof(&arr[0]+1)); //4
表示第二个元素的地址,大小为4个字节

 

printf("%d\n", strlen(arr)); //随机值x
strlen求字符串长度,传的是地址,遇到\0的位置不确定,arr表示首元素地址

printf("%d\n", strlen(arr+0)); //随机值x
遇到\0的位置不确定,arr表示首元素地址

printf("%d\n", strlen(*arr)); //错误
*arr是97作为地址传进去,97作为地址以后的空间不允许访问

printf("%d\n", strlen(arr[1])); //错误
同上

printf("%d\n", strlen(&arr)); //随机值x
 
遇到\0的位置不确定,arr表示首元素地址

printf("%d\n", strlen(&arr+1)); //随机值y     x-y=6
跳过一个数组下一个数组的地址 

printf("%d\n", strlen(&arr[0]+1)); //随机值 w    x-w=1
 从第二个元素向后数, 遇到\0的位置不确定 

 

char arr[] = "abcdef"; (有\0字符)

printf("%d\n", sizeof(arr));    //7
表示数组的大小,7个字节

printf("%d\n", sizeof(arr+0));  //4
arr是首元素地址,大小为4个字节

printf("%d\n", sizeof(*arr));  //1
表示首元素,大小为1个字节

printf("%d\n", sizeof(arr[1]));  //1
表示第二个元素,大小为1个字节

printf("%d\n", sizeof(&arr));  //4
表示数组的地址,大小为4个字节

printf("%d\n", sizeof(&arr+1));  //4
表示跳过一个数组到下一个数组的地址,大小为4个字节

printf("%d\n", sizeof(&arr[0]+1));  //4
表示第二个元素的地址,大小为4个字节

 

printf("%d\n", strlen(arr));  //6
表示字符串长度,大小为6

printf("%d\n", strlen(arr+0));  //6
表示字符串长度,大小为6个

printf("%d\n", strlen(*arr));  //错误
*arr是97作为地址传进去,97作为地址以后的空间不允许访问

printf("%d\n", strlen(arr[1]));  //错误
同上

printf("%d\n", strlen(&arr));  //6
数组的地址和首元素地址值一样,从第一个元素开始数,大小为6

printf("%d\n", strlen(&arr+1));  //随机值
表示跳过一个数组下一个数组的地址,遇到\0的位置不确定

printf("%d\n", strlen(&arr[0]+1));  //5
从第二个元素开始数,大小为5

 

char *p = "abcdef";  //将常量字符串的a放到指针变量p中

printf("%d\n", sizeof(p));  //4
指针变量的大小,为4个字节

printf("%d\n", sizeof(p+1));  //4
b的地址的大小,为4个字节

printf("%d\n", sizeof(*p));  //1
首元素a字符的大小,为1个字节

printf("%d\n", sizeof(p[0]));  //4
p[0] == *(p+0) 大小为1个字节

printf("%d\n", sizeof(&p));  //4
指针变量的地址,大小为4个字节

printf("%d\n", sizeof(&p+1));  //4
还是地址,大小为4个字节(跳过一个char*(指针类型))

printf("%d\n", sizeof(&p[0]+1));  //4
第二个元素地址,大小为4

 

printf("%d\n", strlen(p));  //6
p存放a的地址,往后数大小为6

printf("%d\n", strlen(p+1));  //5
p+1存放b的地址,往后数大小为5

printf("%d\n", strlen(*p));  //错误
*p是97作为地址传进去,97作为地址以后的空间不允许访问

printf("%d\n", strlen(p[0]));  //错误
p[0]相当于*p

printf("%d\n", strlen(&p));  //随机值

遇到\0的位置不确定

printf("%d\n", strlen(&p+1));  //随机值
遇到\0的位置不确定

printf("%d\n", strlen(&p[0]+1));   //5
b的地址往后数,大小为5

 

二维数组

int a[3][4] = {0};  

printf("%d\n",sizeof(a));  \\48
表整个数组的大小,为48个字节

printf("%d\n",sizeof(a[0][0]));  \\4
表示第一行第一列的元素的大小,为4个字节

printf("%d\n",sizeof(a[0]));  \\16
第一行数组名单独放在sizeof内部,表示第一行元素的大小,为16个字节

printf("%d\n",sizeof(a[0]+1));  \\4
第一行第一个元素地址加1为 第一行第二个元素的地址,大小为四个字节

printf("%d\n",sizeof(*(a[0]+1)));  \\4
第一行第二个元素大小,为4个字节

printf("%d\n",sizeof(a+1));  \\4
首元素(第一行)地址加1 为第二行的地址,大小为4

printf("%d\n",sizeof(*(a+1)));  \\16
第二行元素的大小,为16个字节

printf("%d\n",sizeof(&a[0]+1));  \\4
第一行的数组名取地址是第一行的地址 加1是第二行的地址,大小为4个字节

printf("%d\n",sizeof(*(&a[0]+1)));  \\16
第二行元素大小,为16个字节

printf("%d\n",sizeof(*a));  \\16
第一行的大小,为16个字节    *(a+0)== a[0]

printf("%d\n",sizeof(a[3]));  \\16
sizeof内部表达式不参与运算,算的是一行的元素的大小,不存在越界。大小为16个字节。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值