用数组和指针理解 strcpy

问题描述

我有一些合并 strcpy 数组和指针的代码。我不明白为什么代码显示 "Good exam"。我看到在调用 strcpy 之后,ptr 包含 "lexam"。那么,您能解释一下 a[] 的值何时发生变化吗?

char a[50] = "Good luck!";
char b[50] = { 'i','n',' ','t','h','e','x','a','m','\0' };
char* ptr = a + 5; cout << *ptr;
strcpy(ptr,&b[7]); 
for (int i = 0; i < strlen(ptr); i++)
    cout << ptr[i];
cout << a;

解决方法

    [0][1][2][3][4][5][6][7][8][9][10] [11]
a = [G][o][o][d][ ][l][u][c][k][!][\0]
b = [i][n][ ][t][h][e][ ][e][x][a][m]  [\0]

char* ptr = a + 5;

      [0][1][2][3][4][5]
ptr = [l][u][c][k][!][\0]

        [0][1][2][3][4] 
&b[7] = [e][x][a][m][\0]

您所做的是替换以 b[7] 开头的内容并覆盖以 ptr 开头的内容(相当于 a + 5&a[5])。

因此在 strcpy 之后你有:

      [0][1][2][3][4][5]
ptr = [e][x][a][m][\0][\0]

请注意,符号 ! 出现的位置现在是 \0,因为 &b[7] 的长度为 4,而 ptr 的长度为 5。