如何打印指针的指向值?

时间:2012-10-18 12:48:02

标签: c pointers memory-address

我在教科书中找到了以下代码:

#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;
}

 }

代码工作正常,但我对逻辑有疑问:

  1. 我正在发送数组变量的地址。但是在disp函数中,我使用指针变量作为参数并打印指针的值。因此,main函数发送的参数类型应与disp的参数不匹配。那它是如何运作的呢?

  2. 我尝试将disp函数更改为

    来做同样的事情
    void disp( int (&k))
    {
    printf("%d",*k);
    }
    

    但是我收到了一个错误。我应该怎样做才能通过将地址作为参数来使其工作,即void disp(int &k)

5 个答案:

答案 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)

好吧,我只能说你在函数中传递地址并在指针中接收它。它正确,因为指针可以指向或保持地址。或者其他方式,只是如果您发送地址但将其存储在参考变量中,但是引用谁,是要问的问题。反之亦然,你会更好地理解结构...