在下面的代码中,char指针与int指针有何不同? 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; 而(*s1++=*s2++) { 对于(i=0;i

在下面的代码中,char指针与int指针有何不同? 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; 而(*s1++=*s2++) { 对于(i=0;i,c,pointers,C,Pointers,而言,C中字符串的特点是它们有一个特殊的字符来标记字符串的结尾。它是'\0'字符。这个特殊字符的值为零 在第二个程序中,您拥有的数组包含终止符字符,由于它为零,因此在布尔表达式中使用时将被视为“false”(如while循环中的条件)。这意味着您在第二个程序中的循环将复制包含终止符字符的字符,但因为这是“false”循环将结束 在第一个程序中没有这样的终止符,循环将继续并超出边界,直到它在您要复制的内存中随机找到一个零。这会导致未定义的行为,这是导致崩溃的常见原因 因此,区别不在于指针的处理方式

而言,C中字符串的特点是它们有一个特殊的字符来标记字符串的结尾。它是
'\0'
字符。这个特殊字符的值为零

在第二个程序中,您拥有的数组包含终止符字符,由于它为零,因此在布尔表达式中使用时将被视为“false”(如
while
循环中的条件)。这意味着您在第二个程序中的循环将复制包含终止符字符的字符,但因为这是“false”循环将结束

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


因此,区别不在于指针的处理方式,而在于数据。如果在第一个程序(
B
)的源数组末尾添加一个零,那么它也可以正常工作。

在str2中,您已经分配了字符串。这意味着将有 字符串('\0'或NULL),因此当您将递增Str2时,它将 到达字符串的末尾,它将返回null,所以循环将中断


对于整数指针,字符串没有结尾。这就是它进入无限循环的原因。

Joachim对C语言中的字符串结尾字符
\0
给出了很好的解释

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

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

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

使用名为
intPtr
int*
指针,在int存储在4字节的系统上,执行
intPtr++
将使intPtr中的值增加4(4字节),以准备指向内存中的下一个int

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);
   }