谁能不死 发表于 2019-11-10 14:13:41

指针 求解惑

本帖最后由 谁能不死 于 2019-11-11 08:39 编辑

# include <stdio.h>

int main(void)
{
        char a[] = "fishc.com is a good web site !",b, *p, *q;
       
        p =a, q = b;
        for (;*p !='\0';++p,++q)
        {
                *q = *p;
        }
        *q = '\0';

        printf(" %s\n", a);
        printf(" %s\n", b);
        return 0;


*q ='\0';为什么需要这行;这行有什么作用,老师视频中没有说,我也想不明白;哪位大神可以给说是怎么回事吗?

谁能不死 发表于 2019-11-11 08:38:21

发个求助帖也要审核几天吗?

倒戈卸甲 发表于 2019-11-11 16:52:46

大家一般习惯于用char a[]="**gshbsvsh"这样的方式来初始化一个字符串,但如果是char a[]={'a','b','c','d','\0'}的方式来初始化,须以'\0'结尾。这个其实你应该有个大概印象才对,只是没特别注意。

谁能不死 发表于 2019-11-11 17:05:40

倒戈卸甲 发表于 2019-11-11 16:52
大家一般习惯于用char a[]="**gshbsvsh"这样的方式来初始化一个字符串,但如果是char a[]={'a','b','c','d' ...

*q指向a[]数组,a[]数组没有结束符'\0'吗?

倒戈卸甲 发表于 2019-11-11 17:17:23

谁能不死 发表于 2019-11-11 17:05
*q指向a[]数组,a[]数组没有结束符'\0'吗?

。。。p指向a,q指向b,然后那个循环体*q刚好取不到\0

谁能不死 发表于 2019-11-11 17:37:33

倒戈卸甲 发表于 2019-11-11 17:17
。。。p指向a,q指向b,然后那个循环体*q刚好取不到\0

*q,为什么会取不到‘\0’呢?*p 里面也没有‘\0’吗?

倒戈卸甲 发表于 2019-11-11 17:51:03

谁能不死 发表于 2019-11-11 17:37
*q,为什么会取不到‘\0’呢?*p 里面也没有‘\0’吗?

仔细阅读程序啊,for语句里把'\0'作为循环停止的条件了

谁能不死 发表于 2019-11-11 17:52:10

倒戈卸甲 发表于 2019-11-11 17:51
仔细阅读程序啊,for语句里把'\0'作为循环停止的条件了

非常感谢 你

谁能不死 发表于 2019-11-11 18:02:27

倒戈卸甲 发表于 2019-11-11 17:51
仔细阅读程序啊,for语句里把'\0'作为循环停止的条件了

因为看到有些不用刻意赋值‘'\0',好像也可以;主要是想不明白把‘\0’赋值过去,为什么不会把前面的值给覆盖了

倒戈卸甲 发表于 2019-11-11 18:10:30

本帖最后由 倒戈卸甲 于 2019-11-11 19:15 编辑

谁能不死 发表于 2019-11-11 18:02
因为看到有些不用刻意赋值‘'\0',好像也可以;主要是想不明白把‘\0’赋值过去,为什么不会把前面的值给 ...

我确实也见过不在末尾添加‘\0'也编译通过的情况,里面的门道比较复杂,我不敢随便回答,怕说错误导你。后一个问题很简单,因为for循环语句中的++q,就一定不会覆盖,而是把'\0'放到最后。因为q自加指向了下一个内存地址,但不符合判断条件什么都没做就退出了循环体,于是此时刚好可以被正常赋值
页: [1]
查看完整版本: 指针 求解惑