将指针传递给函数 - 为什么我不能打印地址?

时间:2017-08-26 00:00:53

标签: c++ pointers

我不明白为什么我无法打印指针的地址。我知道理解指针非常重要,所以任何帮助都会受到赞赏。

ffmpeg.exe -i aa.mp4 -f mpegts tcp://localhost:12345

当我尝试使用' printp(p)'时,我收到以下错误。

void printp(int& test)
{
        cout << test << endl;
}

int main()
{
        int *p = new int;
        *p = 1;
        int np = 0;

//      printp(p);  // why doesn't this print the address of p?
//      printp(&p); // why doesn't this print the address of p?
        printp(*p); // prints 1
        printp(np); // prints 0

return 0;
}

4 个答案:

答案 0 :(得分:8)

您从编译器收到错误消息,因为编译器需要参考参数的确切类型。

当函数具有参考参数

void printp(int& test);

而不是指针参数,

void printp(int* test);

调用者必须提供确切类型的变量。它不能提供对任何其他类型的变量的引用(除非您可以从其他类型的dynamic_cast到参数的类型)。

因此,当您致电printp(p);时,编译器要求p的类型为int,而不是int *

如果你按值传递,编译器会为你推广或static_cast某些类型,

void printp(int test);
short s = 0;
printp( s ); // s is promoted to int here.

但是当参数是引用时,编译器无法为您执行此操作。

答案 1 :(得分:2)

在你的代码中printp(int&)是一个函数,它接受引用而不是指针,所以在你的情况下得到指针的地址,你可以简单地改变它或重载它:

void printp(int* test){
    cout << test << endl; // the addres test contains not its address
    cout << &test << endl; // the address of test itself
    cout << *test << endl; // the value in the address that test points to
}

主要:

printp(p);

输出:

00893250
0018FEEC
1

答案 2 :(得分:2)

int a;

expr | type
-----+-----
&a   | int*
a    | int
*a   | - (not valid)

代表int* p;

expr   | type
-------+-----
&p   | int**
p    | int*
*p   | int
**p  | - (not valid)

代表int** pp;

expr   | type
-------+-----
&pp   | int***
pp    | int**
*pp   | int*
**pp  | int
***pp | - (not valid)

答案 3 :(得分:0)

INT&安培;是int的引用而不是指针。您需要将函数定义更改为:

void printp(int* test)
{
   cout << test << endl;
}

然后在main()

printp(p);
printp(&np);

这将输出如下内容:

0x55847f523c20
0x7ffffc7fb07c