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

时间:2016-01-09 17:56:09

标签: c++ pointers pointer-arithmetic

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

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

2 个答案:

答案 0 :(得分:2)

您的字符串不会以空值终止,因此<<会一直输出超出"Hello"的字符,直到它在内存中发现'\0'甚至崩溃为止。试试这个:

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

或者,@ n.m。提示:

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

我相信如果我理解上面的代码,我就能理解这一点:

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

此处,pc是指向高于char的内存地址2 x char的{​​{1}}指针。减去这两个指针得到2。

执行cstd::cout << pc;; (使用std::cout << c + 2

将:c[6]作为输出。

答案 1 :(得分:0)

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

尝试

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

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

char c[] = "Hello"; 

这将自动处理null终止,如果你为数组指定的维度太小,编译器会抱怨。

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