数组地址的偏移和数组解引用

    一维数组:arr[n]

有如下形式:arr+1

                      arr[n]+1

                      (&arr)+1

数组名是一个地址,也是一个常量
    int arr1[6] = {1,2,3,4,5,6};
    (&arr1)+1 对整个数组做了一个地址偏移,+1代表跨过整个数组所占的空间

理解:arr1的地址代表数组的首地址,&arr1虽然是取出首地址,但是其后面的地址都属于这个数组的空间,属于一整个块块。+1只能是以这个数组为单位的后面。


     printf("%p\n",  arr1+1);    //偏移一个数据类型的大小
     printf("%p\n",  (&arr1)+1); //意味着偏移了整个数组的大小
     printf("%p\n",  &arr1[1]);

    printf("%d\n",  (*arr1)+1);  //2   只是打印arr1[0] + 1 没有进行赋值操作       

    *arr1解引用首地址代表的数组为arr1[0]=1;
    printf("%d\n",  ++ (*arr1)); //2   arr1[0] = arr1[0] +1 做了赋值操作
    printf("%d\n",  (*arr1)++);  //2   由于是后置++ 所以线得到结果然后再赋值 
    printf("%d\n",  *arr1);      //3

二维数组:

同理:

//完全初始化
    int arr[3][3] = {1,2,3,
                     4,5,6,
                     7,8,9};

    //arr[0][0+1];   //列偏移 偏移一个元素的大小
    //arr[0+1][0];   //行偏移 偏移一个数组的大小

    // &arr+1       //偏移整个二维数组的大小        此时以arr整个数组为单位进行偏移。
    // &arr[0]+1    //行偏移        此时以arr[0]一行为单位进行偏移。
    // &arr[0][0]+1 //列偏移        此时以arr[0][0]一列为单位进行偏移。

    printf("%d\n",**(*(&arr+1))); //arr[0][0]

&arr一层解引用为arr[],此时为地址,解引用二层为arr[][],此时还是为地址,解引用第三层的时候才为数据!
    printf("%d\n",*(*(&arr[0]+1)));
    printf("%d\n",*(&arr[0][0]+1));

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
指针数组数组指针是两个不同的概念,它们在语法和语义上有所区别。 1. 指针数组: 指针数组是一个由指针类型的元素组成的数组。它是一个数组,每个元素都是一个指针。每个指针可以指向不同类型的数据或者相同类型的数据。在内存中,指针数组的每个元素都是一个独立的指针。可以通过索引来访问和操作每个指针元素。 ```c int* ptrArr[3]; // 声明了一个包含3个指针元素的指针数组 ``` 2. 数组指针: 数组指针是一个指向数组的指针。它是一个指针,指向一个数组的首地址。使用数组指针时,可以通过引用指针来访问和操作整个数组。可以通过偏移指针来访问数组中的不同元素。 ```c int (*ptr)[3]; // 声明了一个指向含有3个元素的数组的指针 ``` 区别: - 表现形式:指针数组是一个数组,每个元素都是指针;而数组指针本身是一个指针,指向一个数组。 - 访问方式:指针数组使用索引来访问和操作每个指针元素;而数组指针使用引用偏移来访问和操作整个数组。 - 内存布局:指针数组的每个元素都是独立的指针,存储在不同的内存地址;而数组指针指向的是整个数组的首地址。 需要注意的是,指针数组数组指针在某些情况下可以互换使用,但在语义上有所区别。理它们的差异对于正确使用和理指针和数组的概念很重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值