10、数组指针与指针数组(内存布局、理解、地址强制转换(题目))

 

1. 指针数组与数组指针的内存布局

指针数组:首先它是一个数组,数组的元素都是指针,数组占多少字节由数组本身决定

                                                                


数组指针:首先它是一个指针,它指向一个数组,在32位系统下永远占4字节

                       

           数组指针可以这么定义:int (*)[5] p,其中int (*)[5]为类型名,p为指针变量

 

2.指针数组与数组指针的理解
      char a[5] = {'A','B','C','D'};

      char (*p3)[5] = &a;

      char (*p4)[5] = a;

     &a是数组的首地址,而a是数组首元素的首地址,值相同但意义不同。在C中,赋值号“=”两边的类型必须是相同的

     p3这个定义“=”两边的数据是一致的,而p4却不一致因为左边的类型是指向整个数组的指针,右边的数据类型是指向单个字符的指针

3. 地址强制转换(题目)

题2:

 int main()

  {

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

      int *ptr1 = (int *)(&a + 1);

      int *ptr2 = (int *)((int)a+1);

      printf("%x,%x",ptr1[-1],*ptr2);

      return 0;   

   }

解析:

   ptr1:&a + 1 指向下一个数组的第一个元素,即a[5],而ptr1[-1] = *(ptr1 - 1) = 0x4

   ptr2:(int)a + 1:a在这里是数组首元素的首地址,即&a[0],(int)a是一个整型数,即ptr2指向元素a[0]的

          第二个字节

   其内存布局如下图所示:

            10. <wbr>数组指针与指针数组(内存布局、理解、地址强制转换(题目))
  这时要考虑大小端了,写一个检查大写端的函数,然后确定其值即可

*************************************************************************************************

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值