指针间接混淆

fud*_*din 1 c

我有一个数组:

int x[3][5]={
        {1,2,3,4,5},
        {6,7,8,9,10},
        {11,12,13,14,15}
        };
Run Code Online (Sandbox Code Playgroud)
  1. *x指的是什么?
  2. *(*x + 2)+5指的是"8".这是怎么发生的?
  3. *(*x + 2)与*(*x)+2相同吗?
  4. 如果我这样做:

    *N = X; 指针n指向哪里?如果它只是x而不是&那么它就是基地址.现在是什么?

Wil*_*ean 6

*x指的是第一个数组({1,2,3,4,5}),相当于x [0].添加一个以x移动到下一个数组,因此*(x+1)将引用第二个数组,并且相当于x [1].

*(*x + 2)因此是第一个数组中的第三个元素,即3.这意味着它*(*x + 2) + 5等于8.

括号很重要,例如,*(*(x+2))它将是第三个数组中的第一个元素.

*(*x + 2)得到的值相同*(*x) + 2,但不使用数组的相同元素.


Bob*_*Bob 5

  1. *x是一个解除引用操作.换句话说,"给我x指的是什么".由于这是一个数组(数组),解引用x将为您提供第一个数组.这相当于数组访问语法x[0].

  2. *(*x+2)+5相当于x[0][2] + 5,它给你8.这是因为: *xx[0](见#1)相同并且与之*(x + 2)相同x[2].一旦你完成了两次解引用,就会从数组(类似于双指针)到数组(单指针)到实际数字(第一个数组中的第三个项目).然后,它只是3 + 5 = 8.

  3. *(*x+2)相当于x[0][2](见#2),它是3(数组中的第三个元素).但是,*(*x) + 2给你x[0][0] + 2(数组中的第一个元素加2),即1 + 2 = 3.相同的答案,但获得它的方式却截然不同.