有人可以一步一步地向我解释这段代码的作用吗?
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);
}
答案 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)
int (*num_ptr) [3]= numbers;
将num_ptr
声明为指向3 int
数组的指针,并将其初始化为数组numbers
的第一个元素。它相当于
int (*num_ptr) [3]= &numbers[0];
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
。
同样,**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。