函数中* p和(* p)之间有什么区别?
我是编程和学习C中数组指针的新手。看看下面的程序。
第一个节目
#include int fun(); int main() { int num[3][3]={21,325,524,52,0,6514,61,33,85}; fun(num); printf("%d",*(*(num+1)+1)); *(*(num+1)+1)=0; printf("%d",*(*(num+1)+1)); return 0; } int fun(int **p) { *(*(p+1)+1)=2135; return 0; }
第二个节目
#include int fun(); int main() { int num[3][3]={21,325,524,52,0,6514,61,33,85}; fun(num); printf("%d",*(*(num+1)+1)); *(*(num+1)+1)=0; printf("%d",*(*(num+1)+1)); return 0; } int fun(int *p) { *((p+1)+1)=2135; return 0; }
第3节目
#include int fun(); int main() { int num[3][3]={21,325,524,52,0,6514,61,33,85}; fun(num); printf("%d",*(*(num+1)+1)); *(*(num+1)+1)=0; printf("%d",*(*(num+1)+1)); return 0; } int fun(int (*p)[3]) { *(*(p+1)+1)=2135; return 0; }
- 在第一个程序中,
**p
在fun()
函数中使用,我认为它应该是正确的,并且在该函数中我写了*(*(p+1)+1)
来改变第一个数组的第一个元素。 但是在编译这个程序时,它显示error: invalid type argument of unary '*' (have 'int')
。 据我所知,num是一个指向数组的指针,它保存num[1]
的地址,该地址再次保存num[1][0]
的地址。 - 在编译第二个程序时,编译器没有显示错误。 并且
*((p+1)+1)=0
正在改变第一个数组的第二个元素的值。 为什么它改变第0个第2个元素的值而不是第一个数组的第一个元素的值? 如何? 它应该是*(*(p+1)+1)=0
。 - 在第三个程序中,编译器没有显示错误,并且显示正确的结果。 怎么样?。
*(p)[3]
是什么意思?
我搜索过这个但是找不到满意的结果。
我想你在问:两者之间有什么区别
int fun(int *p)
和
int fun(int (*p)[3])
第一个需要指向int
的指针。 第二个需要一个指向3个int
的数组的指针。
您可以使用num
调用这两个函数,因为您声明了函数
int fun();
如果声明函数已定义,则会出现第一个版本的编译器错误/警告。
这是使用gcc和编译器标志-Wall
代码的更新版本以及生成的编译器警告。
#include int fun(int *p); int main() { int num[3][3]={21,325,524,52,0,6514,61,33,85}; fun(num); return 0; } int fun(int *p) { *(p+0)=2135; return 0; }
test.c: In function 'main': test.c:7:4: warning: missing braces around initializer [-Wmissing-braces] test.c:7:4: warning: (near initialization for 'num[0]') [-Wmissing-braces] test.c:8:4: warning: passing argument 1 of 'fun' from incompatible pointer type [enabled by default] test.c:3:5: note: expected 'int *' but argument is of type 'int (*)[3]'
你的所有程序都是格式错误的。 您的编译器必须生成警告或错误消息,并且生成的任何可执行文件的输出都是无意义的。
它们是格式错误的,因为int[3][3]
与int **
不兼容,也不与int *
兼容,也不与int *[3]
兼容。
要将int[3][3]
传递给函数,该函数必须接受int (*)[3]
接受其他任何东西(好吧,除了void *
)。
这是因为数组可以转换为指向数组第一个元素的指针。 (在C语法中, num
可用于表示&num[0]
)。
在C中,只有真正的一维数组; int[3][3]
类型的数组被认为是3个元素的数组,每个元素都是3个int的数组。
因此,指向num
的第一个元素的指针是指向3个int的数组的指针,它被写为int (*p)[3]
。 你可以写:
int (*p)[3] = &num[0];
或同一事物的简写:
int (*p)[3] = num;
NB。 你不断写*(*(num+1)+1))
很难读。 而不是这个, num[1][1]
似乎更清楚。
在C中, x[y]
总是完全等于*(x+y)
。