在许多示例中,我看到,如果int x = 0; int *ptr; ptr = &x
则ptr正在保存x的地址信息。我有点困惑为什么如果以下代码执行相同的操作。当我打印ptr
时,它会显示:
应用
而不是p [0]的地址。
#include <iostream>
#define show(a) std::cout<<a<<std::endl;
#define Syswait std::system("pause");
int main() {
char p[] = "app";
char *ptr;
ptr = &p[0];
show(ptr);
Syswait;
}
有人可以解释一下吗?感谢。
答案 0 :(得分:2)
因为这是声明函数的功能。 ptr
是一个char*
(字符指针),并且有一个专门定义为接受它的重载。
std::cout<<a
actually calls函数声明为:
template< class Traits >
basic_ostream<char,Traits>& operator<<( basic_ostream<char,Traits>& os,
const char* s );
从链接中我们了解该功能将做什么:
构造并检查岗哨对象后,插入连续 字符数组中指向第一个元素的字符 由s。
为避免这种情况,请转发至void *
:
std::cout << (void *)a;
答案 1 :(得分:2)
指针实际上正在完成它的工作。它实际上不是指针,但它是你必须观察的cout。
考虑以下代码
#include<iostream>
using namespace std;
int main(){
Char p[ ] = "app";
Cout<<p<<endl;
Return 0;
}
在上面的代码cout<<p<<endl;
中,p将输出p的第0个索引的地址。如果使用指针存储第0个索引,则它是相同的。
Cout会将char变量的指针视为cstring,因此会打印数组的所有字符。
你正在使用指针做同样的事情。