在下面的代码中,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中字符串的特点是它们有一个特殊的字符来标记字符串的结尾。它是在下面的代码中,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”循环将结束 在第一个程序中没有这样的终止符,循环将继续并超出边界,直到它在您要复制的内存中随机找到一个零。这会导致未定义的行为,这是导致崩溃的常见原因 因此,区别不在于指针的处理方式
'\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);
}