指针变量名返回的值是多少?

What's the value returned by pointer variable name?

我不明白为什么以下代码分别产生以下输出:

char c[ 5 ] = { 'H', 'e', 'l', 'l', 'o' };
char* pc = c;
std::cout << pc;

Output

我需要理解这一点,因为我正在做一个练习,我需要通过一个指向该数组的指针找到数组的索引。在网上,我找到了一个类似下面的代码,但我不明白它的结果,虽然它解决了我的问题,但我相信如果我理解上面的代码我就能理解这个:

char c[ 5 ] = { 'H', 'e', 'l', 'l', 'o' };
char* pc = &c[2];
int index = pc - c;
std::cout << index; // 2

您的字符串不是 null-terminated,因此 << 一直输出 "Hello" 之外的字符,直到它在内存中找到 '[=15=]' 甚至崩溃。试试这个:

char c[6] = { 'H', 'e', 'l', 'l', 'o', '[=10=]' };
char* pc = c;
std::cout << pc;

或者,如@n.m。建议:

char c[] = "Hello";
char* pc = c;
std::cout << pc;

I believe that if I understand the above code I could understand this:

char c[ 5 ] = { 'H', 'e', 'l', 'l', 'o' };
char* pc = &c[2];
int index = pc - c;
std::cout << index; // 2

这里,pc 是一个 char 指针,指向比 c 高 2 x char 的内存地址。减去这 2 个指针得到 2.

std::cout << pc;std::cout << c + 2; (c[6]

将给出:llo 作为输出。

当您 stream << 一个指向 char 的指针时,它会打印字符,直到遇到值为 0 的字符。在您的情况下,它永远不会打印(直到它超出数组边界),这是未定义的行为。

尝试

char c[6] =  { 'H', 'e', 'l', 'l', 'o', 0 };

顺便说一句,您可以(并且可能应该)直接用字符串文字初始化一个 char 数组!

char c[] = "Hello"; 

这将自动处理 null-termination,如果您为数组指定的维数太小,编译器会报错。

char c[5] = "Hello"; //ERROR