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变量是否增加超出数组的长度?
答案 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。