【发布时间】:2014-12-03 12:06:11
【问题描述】:
我是编程和学习数组指针的新手。我现在有点困惑。看看下面的程序:
#include <stdio.h>
int fun();
int main()
{
int num[3][3]={23,32,478,55,0,56,25,13, 80};
printf("%d\n",*(*(num+0)+1));
fun(num);
printf("%d\n", *(*(num+0)+1));
*(*(num+0)+0)=23;
printf("%d\n",*(*(num+0)));
return 0;
}
int fun(*p) // Compilation error
{
*(p+0)=0;
return 0;
}
这是我老师笔记中写的程序。在main() 函数中,在printf() 函数中,取消引用运算符被使用了两次,因为num 是指向数组的指针,所以第一次取消引用运算符将给出指向int 的指针,然后第二个将给出值指针指向的那个。
我的问题是,当我将数组名称作为参数传递给函数fun() 时,为什么要使用*p;为什么**p 不是num 是指向数组的指针?
第二件事为什么使用*(p+0) 来改变数组的第零个元素的值;为什么不 *(*(p+0)+0)=0 就像 main() 函数中的 *(*(num+0)+0) 用于更改第零个元素的值?
整个事情让我很困惑,但无论如何我都必须理解它。我对此进行了搜索,发现指向数组的指针和指向指针的指针之间存在差异,但我不太了解。
【问题讨论】:
-
多维数组是flat。以消除有关它们如何实施的困惑。
-
你会从这个问题的答案中得到答案stackoverflow.com/questions/14100240/…
-
你不会得到编译错误,原型/函数不匹配吗?为什么你问 +0+0 而不是 +0?为什么要在代码中添加静态 0?
-
我没有收到任何编译错误。
-
int fun(*p) { ... }不应该编译。您使用的是什么编译器(带有什么标志)?
标签: c pointers function-pointers memory-address pointer-arithmetic