专家们,《Let us C》一书中给出了一个问题,其中作者要求编写给定程序的输出。 该计划是-
#include<stdio.h>
int main()
{
char s[]="Churchgate: no church no gate";
char t[40];
char *ss,*tt;
ss=s;
while(*ss!='\0')
*tt++=*ss++;
printf("%s\n",t);
return 0;
}
当我在 gcc 编译器上尝试时,输出被核心转储。请解释原因。这里 ss 和 tt 是字符指针。 这里我也不明白ss=s;这句话是什么意思? 我的意思是我们不能直接复制字符串,除非我们逐个字符地复制它。而 ss 是一个字符指针,所以它指向一个字符,那么 ss=s 意味着什么?这是否意味着它将指向地址为 s 的 ASCII 值的字节? 我也不明白这个说法*tt++=*ss++。我对此没有任何线索。请详细说明其含义。
接下来我不明白为什么使用 printf("%s\n",t) 就好像 t 是字符类型一样,但它没有根据程序存储任何内容。
最佳答案
首先是第一件事” 数组名只不过是保存第一个元素地址的指针。 所以,
char s[]="Churchgate: no church no gate";
这里 s 是指针名称。它保存字符串“C”的地址。 现在您已经声明了另一个指针,它也是字符类型,即 ss。
所以,ss=s;意味着 s 也持有 s 持有的地址。
由于您没有存储任何内容,因此它将打印垃圾。同样,指针 tt 最初不存储任何地址(垃圾)。 最后也是最重要的 你不能执行这个操作: *tt++=*ss++; 可能会向您显示所需左值的错误。
关于字符指针和字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47368624/