我不明白为什么我无法打印指针的地址。我知道理解指针非常重要,所以任何帮助都会受到赞赏。
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;
}
答案 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