我认为我理解了指针,但我认为他们对待他们的方式有所不同,而我并没有完全遵循。当我将整数指针或整数的地址传递给showInt时,它将打印出与函数外部相同的内存地址。然而。当我将以下指针传递给showChar;
时char* value = "One";
showChar(value);
第一个元素的地址在函数内部与函数外部不同。我理解这是与传递值一致的行为,并且指针的副本是在函数内完成的,但是我的印象是指针的副本仍然保持相同的地址。处理char指针时为什么会有所不同?如果char指针只存储字符串文字的第一个元素的地址,那么为什么函数中的指针不指向相同的内存位置,而是指向内存中的新区域?这告诉我,它不是复制char指针,而是创建一个新的char指针并为其指定原始指针指向的值。如果是这样,我不明白为什么。
我知道您可以通过传递指针指针或引用指针来访问函数中的指针地址,但为什么会出现这种情况仍然让我感到困惑。
将指针传递给char;
void showChar(char* name){
cout << name << endl;
cout << &name << endl;
}
将指针传递给int;
void showInt(int* num){
cout << num << endl;
cout << *num << endl;
}
答案 0 :(得分:3)
showChar
中的第一行:
cout << name << endl;
将在指针name
后面打印内容,因为C ++中的IO流操作符被重载以将char-pointers打印为文本而不是指针作为数字。
使用此功能中的第二行
cout << &name << endl;
您不打印指针地址name
,而是打印局部变量name
的指针(地址)(恰好是指针类型)。那是一次参考太多了。你想要的是改变operator<<(ostream &, char*)
如何工作的行为,即打印指针地址而不是打印C字符串。
您可以通过简单地转换指针,然后将指针传递给cout
来完成此操作,如下所示:
void showChar(char* name){
cout << (void*)name << endl;
}
答案 1 :(得分:2)
您的showChar
和showInt
功能正在打印不同的内容。
在showChar
中,这个:
cout << &name << endl;
打印name
的地址,这是本地变量。在showInt
中,您不打印&num
的值;而是打印num
的值,这是一个地址,但不是本地变量的地址。
在showChar
中,如果要将name
的值打印为地址,则需要将其转换为其他指针类型,例如{{1 }}:
void*
因为cout << (void*)name << endl;
的{{1}}重载取消引用operator<<
指针并打印它指向的C风格字符串。
更详细:
char*