首页 > 解决方案 > 难以理解高级指针算术语法

问题描述

假设我们得到了下一个设置:

int (*p)[9];
  1. 它是一个常规指针,还是某种指向9*sizeof(int)大内存块的特殊指针?

  2. 我如何引用这种语法?

  3. 假设我有一个给定的矩阵:

int mat[200][9];
int (*p)[9] = mat;

指针算术如何使用它,例如,如果我们要增加 p

  1. 我如何转换为这种类型?

  2. 下一个代码的输出是2 5,我认为它有一个链接到我上面显示的特殊语法。有人可以向我解释为什么不是输出2 1吗?

int main()
{
    int a[5] = {1,2,3,4,5};
    int *ptr = (int*)(&a+1);
    printf("%d %d", *(a+1), *(ptr-1));
    return 0;
}

标签: arrayscpointerspointer-arithmetic

解决方案


你应该阅读

 int (*p)[9];

int [9]作为指向(9 个整数)数组的指针。它是一个常规指针,类型为int [9].

指针算术将与其他指针的情况一样工作,基于指针的大小,即sizeof(int[9]).

也就是说,对于另一个问题,如有疑问,请检查数据类型!

int main()
{
    int a[5] = {1,2,3,4,5};
    int *ptr = (int*)(&a+1);               
    printf("%d %d", *(a+1), *(ptr-1));
    return 0;
}

&a是 if type int (*)[5],所以指针算术将尊重这一点。&a+1指向整个数组之后的第一个元素。

因此,自然地,ptr指向最后一个元素地址之后的一个。所以,通过说*(ptr-1)会得到最后一个元素的值,即5.


推荐阅读