0

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

#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)

4

5 回答 5

5

1)我正在发送数组变量的地址。但是在 disp 函数中,我使用指针变量作为参数并打印指针的值。

了解指针是地址。一个. _ &marks[i] _ int*而且您不是在打印指针的值,而是它指向的值。

printf("%d",*k);

取消*k引用指针并给出指向的值。

void disp( int (&k))

是 C 中的无效语法,&k不是有效的标识符。

于 2012-10-18T12:51:00.820 回答
3

当你这样做时: -

int *k = &marks[i];

上面的语句被分解为:-

int *k;   -> Integer Pointer
k = &marks[i]; --> `k` points to the address of marks[i]

所以,基本上,k是一个integer指针,它指向你的当前元素的地址array

因此,当您 print 时*k,它等效于: - *(&marks[i]),它取消引用值并打印 element 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

于 2012-10-18T12:53:15.617 回答
1

1)您理解正确,在 for 循环中地址被发送到disp. 但是disp接收指针作为参数......这只是一个地址。在该函数内部,您不会打印指针的“值”。您打印该指针指向的值(该地址上的值)。在 printf 调用 "*k" 中,您取消引用指针 - 获取该指针指向的值。

2)您没有更改函数以使其接收地址。您对其进行了更改,以便它接收参考。您也可以说它接收到一个隐藏指针 - 它与指针的作用相同,但您不需要 "*k" 来取消引用它 - 您将它用作普通变量

于 2012-10-18T12:56:32.490 回答
0

阅读指针和变量地址。以及它们是如何使用的。当一个函数需要一个指针时,你必须发送一个指针或一个变量的地址。由于指针保存地址。

您面临的第二个问题是语法错误。因为没有 & 运算符可以应用于“左值”。

于 2012-10-18T12:51:22.560 回答
0

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

于 2012-10-18T12:54:39.087 回答