char指针与下面代码中的int指针有何不同?

时间:2016-10-13 06:32:54

标签: c pointers

1)
  int main()
  {
   int *j,i=0;
   int A[5]={0,1,2,3,4};
   int B[3]={6,7,8};
   int *s1=A,*s2=B;
   while(*s1++ = *s2++)
   {
       for(i=0; i<5; i++)
          printf("%d ", A[i]);
   }
 }


2)
  int main()
  {
     char str1[] = "India";
     char str2[] = "BIX";
     char *s1 = str1, *s2=str2;
     while(*s1++ = *s2++)
        printf("%s ", str1);
   }

第二个代码工作正常,而第一个代码导致一些错误(可能是分段错误)。但是如何在程序2中的指针变量s2正常工作(即直到字符串的结尾),而不是在程序1中,它无限运行.... 另外,在第二个程序中,不知道s2变量是否增加超出数组的长度?

3 个答案:

答案 0 :(得分:7)

C中包含字符串的东西是它们有一个标记字符串结尾的特殊字符。它是'\0'个字符。此特殊字符的值为零。

在第二个程序中,你拥有的数组包含终结符,因为它是零,所以它被视为&#34; false&#34;在布尔表达式中使用时(如while循环中的条件)。这意味着你在第二个程序中的循环将字符复制到包括终结符字符,但因为那是&#34; false&#34;然后循环结束。

在第一个程序中没有这样的终结符,循环将继续并超出界限,直到它随机发生在你要复制的内存中找到零。这会导致未定义的行为,这是导致崩溃的常见原因。

所以差异不在于如何处理指针,而在数据中。如果在第一个程序(B)的源数组末尾添加零,那么它也可以正常工作。

答案 1 :(得分:0)

在str2中,您已指定String。这意味着将会结束 字符串('\ 0'或NULL),因为当你将增加Str2时它将会 到达字符串的结尾,它将返回null,因此你的循环将会中断。

使用整数指针,没有字符串的结尾。这就是为什么它会无限循环。

答案 2 :(得分:0)

Joachim用C语言对字符串终端字符\0做了很好的解释。

使用指针时需要注意的另一件事是指针算术

指针的算术单位是指向的实体的大小。

使用名为char *的{​​{1}}指针,在其中char存储在 1字节的系统上,执行charPtr将增加charPtr 中的值通过* 1 (1个字节)使其准备好指向内存中的下一个字符。

使用名为charPtr++的{​​{1}}指针,在系统上将int存储在 4个字节上,执行int *将增加intPtr 中的值通过4 (4个字节)使其准备好指向内存中的下一个int。