C:很难理解这段代码的while循环中的指针

问题描述 投票:3回答:1

我正在使用调试器来读取这段代码,我对while ((*d++ = *s2++));有点困惑 - 在调试器变量中,d似乎在每次循环后缩短(从'Hello hello''ello hello',而s1变为'cello hello')。什么是循环循环(不应该是while(condition); do(something))

为什么d和s1的变量值不相同(不是d是指向s1的指针)?当他们返回主函数时,curdst = dst的指针?

/*    
  Input: char pointers for source (s2) and destination (s1)

  Output: returns the pointer to the destination (s1)
*/

char *my_strcpy(char * , const char * );

int main()
{

  char src[] = "cs23!";
  char dst[]="Hello hello";
  char *curdst;
  int len=0;

  while(src[len++]);

  // do the copy

  curdst= my_strcpy(dst, src);

  // check to see if the NULL char is copied too.

  printf("dst array %s and last element %d\n", dst, atoi(&dst[len]));

  return 0;

}

char *my_strcpy(char *s1, const char *s2) {

  register char *d = s1;

  // print the pointer variables address and their contents, and first char

  printf("s2 address %p, its contents is a pointer %p to first char %c \n", (void *)&s2, (void *)s2, *s2);
  printf("s1 address %p, its contents is a pointer %p to first char %c \n", (void *)&s1, (void *)s1, *s1);

  while ((*d++ = *s2++));
  return(s1);

}
c pointers
1个回答
2
投票

这是strcpy()的一个相当典型的教学实现。它的工作原理如下:

  • my_strcpy()有两个论点。第一个参数是指向目标字符数组的第一个元素的指针。第二个参数是指向源字符串的第一个元素的指针,即由NUL(aka \0)字符终止的字符数组。该函数将字符串从源字符串复制到目标缓冲区,包括NUL终结符,并返回指向目标缓冲区的第一个元素的指针。 char *my_strcpy(char *s1, const char *s2) {
  • 首先,制作第一个参数的副本,因为我们需要在复制完成后返回它。 char *d = s1;
  • 然后,复制字符;这是在一个紧凑的循环中完成的,工作方式如下: 将当前字符* s2复制到d指向的位置,就像执行* d = * s2一样;然后 增加d指向目标缓冲区中的下一个位置,就像执行d++并增加s2指向要复制的下一个字符一样,如同执行s2++;和 如果复制的最后一个字符是NUL,则退出循环。 这是以非常简洁的方式编写的: while (* d++ = * s2++); * s2++的意思是“采取s2指向的角色然后增加s2”。类似地,* d++作为左手值意味着“使用d指向的变量然后增加d”。运算符的优先顺序有助于省略括号,因为++的优先级高于*,后者的优先级高于=。赋值的值是赋值,因此当赋值的字符值为0时,循环结束。
  • 最后,返回s1,该功能没有改变。 return s1; }
© www.soinside.com 2019 - 2024. All rights reserved.