我在教科书中找到了以下代码:
#include<stdio.h>
void disp( int *k)
{
printf("%d",*k);
}
int main( )
{
int i ;
int marks[ ] = { 55, 65, 75, 56, 78, 78, 90 } ;
for ( i = 0 ; i <= 6 ; i++ )
disp ( &marks[i] ) ;
return 0;
}
}
代码工作正常,但我对逻辑有疑问:
我正在发送数组变量的地址。但是在disp
函数中,我使用指针变量作为参数并打印指针的值。因此,main
函数发送的参数类型应与disp
的参数不匹配。那它是如何运作的呢?
我尝试将disp
函数更改为
void disp( int (&k))
{
printf("%d",*k);
}
但是我收到了一个错误。我应该怎样做才能通过将地址作为参数来使其工作,即void disp(int &k)
?
答案 0 :(得分:5)
1)我发送数组变量的地址。但是在disp函数中,我使用指针变量作为参数并打印指针的值。
了解指针是一个地址。因此&marks[i]
是int*
。而且你不打印指针的值,而是指向它指向的值。
printf("%d",*k);
*k
取消引用指针并给出指向的值。
void disp( int (&k))
是C中的无效语法,&k
不是有效的标识符。
答案 1 :(得分:3)
当你这样做时: -
int *k = &marks[i];
以上陈述分为: -
int *k; -> Integer Pointer
k = &marks[i]; --> `k` points to the address of marks[i]
所以,基本上,k
是一个integer
指针,它指向array
中当前元素的地址。
因此,当您打印*k
时,它相当于: - *(&marks[i])
,它取消引用该值并打印元素marks[i]
。
因此,在下面的代码中,您可以了解pointer
作业和de-referencing
的整个过程如何发生: -
int *k; // Declaring integer pointer.
// Actually 'k' is equal to the `&marks[i]`.
// '*k' is just the indication of it being a pointer
k = &marks[i];
// Dereference pointer
*k = *(&marks[i]); --> = marks[i]
printf("%d",*k); --> printf("%d",marks[i]);
此外,由于您无法声明变量,如: -
int &k = &marks[i];
您不能将它们作为参数添加到您的函数中: -
void disp(int &k);
因为,最终传递的array element
的地址存储在此变量中。所以,它必须是int *k
。
答案 2 :(得分:1)
1)您理解在for循环中地址被发送到disp
是正确的。但是disp
接收指针作为参数......这只是一个地址。在该函数内部,您不打印指针的“值”。您打印该指针指向的值(该地址上的值)。在printf调用“* k”中,您取消引用指针 - 获取该指针指向的值。
2)您没有更改功能以便接收地址。你改变它,以便它接收参考。你也可以说它接收到一个隐藏指针 - 它与指针一样,但你不需要“* k”来取消引用它 - 你将它用作普通变量
答案 3 :(得分:0)
读取指针和变量地址。以及他们如何使用。 当函数需要指针时,您必须发送指针或变量的地址。由于指针持有地址。
您遇到的第二个问题是语法错误。因为没有&amp;可以应用于&#34; lvalues&#34;的运算符。
答案 4 :(得分:0)
好吧,我只能说你在函数中传递地址并在指针中接收它。它正确,因为指针可以指向或保持地址。或者其他方式,只是如果您发送地址但将其存储在参考变量中,但是引用谁,是要问的问题。反之亦然,你会更好地理解结构...