#include <iostream>
using namespace std;
char* input(char **S);
int main()
{
char **S = new char *;
char *K = input(S);
//cout << K << endl;
cout << *K << endl;
}
char* input(char **S)
{
cout << "Enter string: ";
cin >> *S;
cout << S << endl; // Prints address of S
cout << *S << endl; //Prints content of address stored in S
return *S;
}
我无法理解为什么当我打印出 *K 时,我只得到输入字符串的第一个字符,但如果我打印出注释行(仅 K )我得到整个字符串。任何帮助解释我无法看到或理解的内容的帮助都会受到赞赏。
让我们了解数组是如何工作的:
// Let's say I have one character array
char arr[] = {'a', 'b', 'c', 'd'};
在这里,数组的名称,即 arr 充当指向数组第一个元素的指针。但是,请注意,为了避免混淆,它不是指向第一个元素的指针,它只是隐式转换为元素类型的指针。更多详细信息可以在这里找到:https://stackoverflow.com/a/1641963/10821123
现在由于数组是连续的,因此可以确定其余元素。
// so ideally, the below two statements would print the same thing
cout << &arr << endl;
cout << (void*) &arr[0] << endl;
// the above line just takes out the address of the first pointer
现在回答你的问题,我将把我的示例转换为字符串一:
char *K = "abc";
cout << *K << endl; // a
cout << K << endl; // abc
请注意,上面的
char *K = "abc";
分配会给你一个警告:ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
指针仅保存数组第一个元素的地址,因此当您取消引用指针时,它会打印第一个元素,即
*K
被解释为 K[0]
现在有
operator <<
的重载,所以它的作用是,如果它看到一个字符指针,即 char*
,它会打印完整的以 null 结尾的字符串,这就是为什么在你的情况下,它也会打印整个字符串。
如果我从字符串“s”和保存在指针“p”中的字符串的第一个字符打印地址,为什么地址不同?不应该是一样的吗?我得到相同的字符,但地址不同。
#include <stdio.h>
#include <string>
int main()
{
std::string s = "hello";
char *p = &s[0];
printf("%p\n", s);
printf("%p\n", p);
printf("%c\n", s[0]);
printf("%c\n", *p);
}