我不明白为什么以下代码分别产生以下输出:
char c[ 5 ] = { 'H', 'e', 'l', 'l', 'o' };
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
答案 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。
执行c
或std::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