我以为我理解指针语法,但有一些小事件让我失望,例如:
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
持有的地址的值。这是错误的,原因有二。
array
是一个地址。它不完全是一个整数值。它只是内存中的一个位置。当然,该位置可以用整数表示,就像美国的位置可以用整数邮政编码表示一样,但是就像您通常不关心邮政编码的数值是多少一样,您可能不也不关心给定内存地址的整数值是多少。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/