【问题标题】:Understanding strcpy with array and pointer用数组和指针理解 strcpy
【发布时间】:2021-01-23 21:12:48
【问题描述】:

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

char a[50] = "Good luck!";
char b[50] = { 'i','n',' ', 't','h','e',' ','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;

【问题讨论】:

  • 改成strcpy,果然如所料? “为什么代码显示它显示的“好考试””是什么意思?
  • strcpy ptr 行后包含“lexam” - ptr 是一个指针,它包含一个地址;就是这样,具体来说,它包含数组a 的基数的第五个字符的地址,所有strcpy 所做的只是修改该地址所引用的内存,并且这样做,数组a 的内容。

标签: c++ arrays pointers strcpy


【解决方案1】:
    [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&amp;a[5])。

因此在 strcpy 之后你有:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 2016-03-16
    • 2018-05-08
    • 2019-10-02
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    相关资源
    最近更新 更多