我很难理解pointer2包含什么.第二个printf打印llo World,但第三个打印Hey you guys!.如果strcpyy you guys!\n复制成llo World,为什么会是这样呢.根据我对下面程序的理解,最后的输出应该是llo Worldy you guys!\n,不是吗?

int main() 
{
    char str_a[20];  // a 20 element character array
    char *pointer;   // a pointer, meant for a character array
    char *pointer2;  // and yet another one

    strcpy(str_a, "Hello World\n");

    pointer = str_a; // set the first pointer to the start of the array
    printf("%p\n", pointer);

    pointer2 = pointer + 2; // set the second one 2 bytes further in
    printf("%s", pointer2);       // print it

    strcpy(pointer2, "y you guys!\n"); // copy into that spot
    printf("%s", pointer);        // print again
}

推荐答案

指针pointer指向数组str_a的第一个字符.

pointer = str_a;

数组包含字符串"Hello W或ld\n".

指针pointer2指向字符串的第三个元素

pointer2 = pointer + 2;

也就是说,它指向"llo W或ld\n".

然后覆盖这个子字符串,保持str_a[0]str_a[1]不变.

strcpy(pointer2, "y you guys!\n");

所以数组str_a包含字符串"Hey you guys!\n"

实际上,strcpy的上述调用相当于

strcpy( &str_a[2], "y you guys!\n");

因为反过来这句话

pointer2 = pointer + 2;

相当于

pointer2 = &str_a[2];

pointer2 = &pointer[2];

这个电话呢

printf("%s", pointer); 

输出字符串.

"He"(从str_a[0]开始)加"y you guys!\n"(从str_a[2]开始)生成结果字符串.

C++相关问答推荐

gcc已编译的可执行文件TSB是否同时暗示最低有效字节和最低有效位?

segfault在C中使用getline()函数

C/C++中的状态库

在C中使用强制转换将uint16_t转换为uint8_t [2]是否有效?

如何设置指针指向在函数中初始化的复合文字中的整数?

编译的时候g++通常会比GCC慢很多吗?

当我更改编译优化时,相同的C代码以不同的方式运行

在基本OpenGL纹理四边形中的一个三角形中进行渲染

Flose()在Docker容器中抛出段错误

在for循环中指向数组开头之前

S在本文中的价值观到底出了什么问题?

为什么Fread()函数会读取内容,然后光标会跳到随机位置?

GCC奇怪的行为,有fork 和印花,有换行符和不换行符

For循环不会迭代所有字符串字符吗?(初学者问题)

当我用scanf(&Q;%S%S%S&Q;,单词0,单词1,单词2)输入多个单词时,除了最后一个单词外,每个单词的第一个字符都丢失了

在printf()中用%.*S格式填充长度为0的字符串是否会调用任何UB?如果是,是哪一个?

为什么这个代码的最后一次迭代不能正常工作?

C语言中的指针和多维数组

关于不同C编译器中的__attribute__支持

为什么写入关闭管道会返回成功