c - *p 和 (*p)[3] 在函数中有什么区别?

标签 c function pointers function-pointers memory-address

我是编程新手,正在学习 C 数组中的指针。看看下面的程序。

第一个程序

  #include<stdio.h>
  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<stdio.h>
  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<stdio.h>
  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;
     }
  1. 在第一个程序中,**p 用于 fun() 函数,我认为它应该是正确的,并且在该函数中我编写了 *(*(p+1)+1) 更改第一个数组的第一个元素。但是在编译这个程序时它显示了 error: invalid type argument of unary '*' (have 'int')。据我所知,num 是一个指向数组的指针,它保存着 num[1] 的地址,它又保存着 num[1][0] 的地址.
  2. 在编译第二个程序时,编译器没有显示任何错误。 *((p+1)+1)=0 正在更改第一个数组的第二个元素的值。为什么它改变的是第零个数组的第二个元素的值而不是第一个数组的第一个元素的值?如何?它应该是 *(*(p+1)+1)=0
  3. 在第三个程序中,编译器没有显示错误并且显示了正确的结果。如何?。 *(p)[3] 是什么意思?

我已经对此进行了搜索,但没有找到满意的结果。

最佳答案

你所有的程序都是病式的。您的编译器必须产生警告或错误消息,并且产生的任何可执行文件的输出都是无意义的。

它们的格式不正确,因为 int[3][3]int ** 不兼容,也不与 int * 兼容,也不使用 int *[3]

要将 int[3][3] 传递给一个函数,该函数必须接受 int (*)[3] 而不是其他任何东西(好吧,除了 无效*)。

这是因为数组可以转换为指向数组第一个元素的指针。 (在C语法中,num可以用来表示&num[0])。

在C中,只有真正的一维数组; int[3][3] 类型的数组被认为是一个包含 3 个元素的数组,每个元素都是一个包含 3 个整数的数组。

所以指向num第一个元素的指针是指向3个整数数组的指针,写成int (*p)[3]。你可以这样写:

int (*p)[3] = &num[0];

或同一事物的简写:

int (*p)[3] = num;

注意。您不断地编写难以阅读的 *(*(num+1)+1)) 。而不是这样,num[1][1] 似乎更清晰。

在 C 中,x[y] 始终完全等同于 *(x+y)

关于c - *p 和 (*p)[3] 在函数中有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27281907/

相关文章:

c - 如何使用 snprint() 函数追加字符串

python - 在 Python 中更改了对象

在一定百分比的时间内返回值的 Python 函数

c++ - 拦截应用程序对 DLL 的函数调用

C 编程 -> 链表和结构

python绑定(bind),它是如何工作的?

将汇编内联从 32 位转换为 64 位

c - 为什么使用 & 为带有 * 的函数传递值?

c - 变量 'pminutes' 未初始化就被使用

c - 通过 c 中的管道而不是文件将数据数组传递给 gnuplot