C语言指针(代码说明)

时间:2016-01-28 18:23:00

标签: c pointers memory

有人可以一步一步地向我解释这段代码的作用吗?

int main(int argc, const char* argv[]) {

    int numbers [2] [3] = {{1,2,3},{4,5,6}};
    int (*num_ptr) [3]= numbers;

    printf ("value is : %d\n",*(*(num_ptr+1)));
     printf ("value is : %d\n",**num_ptr);
     printf ("value is : %d\n",*(*num_ptr)+1);
     printf ("value is : %d\n",*(*(num_ptr+1))+1);

    //return (EXIT_SUCCESS);
}

4 个答案:

答案 0 :(得分:1)

如果使用数组索引表示法,则更容易理解代码。在所有情况下,A[B]*(A+B)相同,反之亦然;特殊情况是A[0]*(A + 0)相同,如果*A是有效指针,则与A相同。

应用此转换后,您的代码将变为:

 printf ("value is : %d\n", num_ptr[1][0]);
 printf ("value is : %d\n", num_ptr[0][0]);
 printf ("value is : %d\n", num_ptr[0][1]);
 printf ("value is : %d\n", num_ptr[1][0] + 1);

希望你能从这里拿走它。

num_ptr的定义可确保num_ptr[A][B]numbers[A][B]相同。如果printf语句使用numbers而不是num_ptr,则您的程序将保持不变,因为数组numbers衰减到num_ptr所具有的相同指针值。

答案 1 :(得分:0)

*(*(num_ptr+1))
    ^^^^^^^^^^
    skip the first row

之后没有跳过任何列

Ans = 4

**num_ptr

没有跳过任何行或列

Ans = 1

*(*num_ptr)+1
^^^^^^^^^^^
no rows or column skipped

将1添加到ans

Ans = 2

*(*(num_ptr+1))+1
^^^^^^^^^^^^^^^
skip first row, no columns skipped

添加1回答

Ans = 5

答案 2 :(得分:0)

  1. int (*num_ptr) [3]= numbers;num_ptr声明为指向3 int数组的指针,并将其初始化为数组numbers的第一个元素。它相当于

    int (*num_ptr) [3]= &numbers[0];
    
  2. num_ptr指向数组numbers[0]num_ptr+1指向numbers[1]*(num_ptr+1)取消引用num_ptr+1并提供一个数组。当数组在大多数上下文中衰减到指向其第一个元素时,*(num_ptr+1)将最终给出&number[1][0]。因此,*(*(num_ptr+1))相当于*(*(&number[1])) == *(&number[1][0]) == 4

  3. 同样,**num_ptr会提供1*(*num_ptr)+1)会提供1+1 =2*(*(num_ptr+1))+1会提供4+1 =5

答案 3 :(得分:0)

首先,让我们删除printf语句中的多余括号。

看起来像

 printf ("value is : %d\n", **(num_ptr + 1)  );
 printf ("value is : %d\n", **num_ptr );
 printf ("value is : %d\n", **num_ptr + 1 );
 printf ("value is : %d\n",**( num_ptr + 1 ) + 1 );

num_ptr被声明为指向数组numbers的第一个元素的指针。 数组numbers的元素是两个维度数组{ 1, 2, 3 }{ 4, 5, 6 }

因此表达式*num_ptr产生第一个一维数组。在极少数例外的表达式中,数组被隐式转换为指向其第一个元素的指针。因此,此表达式*num_ptr将转换为指向1的第一个元素的指针,而**num_ptr将赋予该值。

结果这句话

 printf ("value is : %d\n", **num_ptr );

输出1。

本声明

 printf ("value is : %d\n", **num_ptr + 1 );

只是将prvious表达式的值加1并输出为2。

由于num_ptr是指向第一个一维数组的指针,因此num_ptr + 1是指向第二个维度数组{ 4, 5, 6 }的指针。其他计算与上述相同。

如此陈述

 printf ("value is : %d\n", **(num_ptr + 1)  );

输出4和陈述

 printf ("value is : %d\n",**( num_ptr + 1 ) + 1 );

输出4 + 1即5。