c - 函数中的指针语法

标签 c pointers

我以为我理解指针语法,但有一些小事件让我失望,例如:

int *ptr;
int array[4] = {1,2,3,4};
int *arrayEnd = array + n;

for (ptr = array; ptr < arrayEnd; ++ptr)
    sum += *ptr;

return sum;

为什么我们在定义 for 循环时使用 ptr = array 而不是 *ptr = array

我也不明白为什么当函数的参数是指针时,我们不使用星号。

我在书上看到了这个function(ptr);,但为什么不是这个:function(*ptr);

最佳答案

让我们从第一行代码开始:

int *ptr;

如果你声明过

int a;

这意味着什么?这意味着 a 是一个 int。同样,由于您声明了 int *ptr;,这意味着 *ptr 是一个 int

如果*ptr 是一个int,那么ptr 是什么? ptr(没有星号)是一个指向 int 的指针。 指针 是一个保存值地址的变量。在这种情况下,指针是指向 int 的指针,这意味着 ptr 保存的地址处的值是 int

然后你有 int array[4] = {1,2,3,4};。当您声明和定义一个数组时,数组标识符(数组的名称)会告诉您该数组在内存中的位置。在任何表达式中使用时,数组名称会衰减到数组第一个元素的地址。

所以当你有

ptr = array;

您正在将数组第一个元素的地址分配给指针 ptr。由于这是一个 int 数组,您将 int 的地址分配给一个可以保存 int 地址的变量。赋值的左侧和右侧是相同类型的值。

为什么是 ptr 而不是 *ptr?在这种情况下 * 是什么?它是一元解引用/间接运算符。所以

*ptr = array; 

意思是:取右边的值,用这个右边的值替换 ptr 持有的地址的值。这是错误的,原因有二。

  1. array 是一个地址。它不完全是一个整数值。它只是内存中的一个位置。当然,该位置可以用整数表示,就像美国的位置可以用整数邮政编码表示一样,但是就像您通常不关心邮政编码的数值是多少一样,您可能不也不关心给定内存地址的整数值是多少。
  2. ptr 未初始化。回到我们之前的例子:int a;a 的值是多少?我们还没有为它设置一个值,所以它只是垃圾。同样,ptr 还没有指向任何东西。它可以指向一个整数,但我们还没有告诉它要指向哪个整数。 ptr 中没有地址。我们不能说“用这个新值替换 ptr 指向的当前值”,因为 ptr 还没有指向任何值;我们还没有告诉它从哪里开始。

总结一下:通过编写 ptr = array;,您所做的是完全正确的——将指向 int 的指针分配给 类型的变量指向 int 的指针。通过编写 *ptr = array;,您会将一个地址分配给一个整数,这可能不是您想要做的;其次,由于整数本身并没有在内存中的任何地方分配,因此分配无处可去。

这就是为什么 ptr = array; 是正确的,而 *ptr = array 是完全错误的。

关于函数指针的问题是一个单独的问题,所以请问一个关于func(ptr)func(*ptr) 的不同问题。

关于c - 函数中的指针语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18563674/

相关文章:

计算 C 中的特定字符?

C 程序不会从 STDIN 读取输入

c - 如何让用户在我的 C 程序中命名 output.txt 文件?

char 数组和 char 指针与返回地址之间的冲突点

c++ - 以线程安全的方式返回指针

C - 指针作为参数

c - C编程中的当前维数组

c - 逗号运算符在分配期间如何工作?

c - 通过引用传递c中的指针数组

c++ - 使用图像指针绘制图像