学编程的盆子 发表于 2021-2-26 21:50:24

求助一个字符指针的问题

#include<stdio.h>
int main()
{
    char *q, *p = "Language";
    for(q = p; q != "\0"; q++);//为什么不用p++??
    for(q--; q >= p; q--)//(q = 7,q=6)()
    {
      putchar(*q);
    }
    return 0;
}

大佬帮我看看这个程序,为什么第一个for那里不用写p++。

我所理解的这里的指针指向的是单个字符,正确吗?

那既然如此,那p++不也是需要的吗?

巴巴鲁 发表于 2021-2-27 09:25:13

本帖最后由 巴巴鲁 于 2021-2-27 09:27 编辑

这里的指针指向的确实是单个字符,你理解的正确
#include<stdio.h>
int main()
{
        /*
    char *q, *p = "Language"; // 这里让p指向了"Langueage"的首地址 ,即*p = L
    for(q = p; q != "\0"; q++); // p的地址赋值给了q, q++不是相当于p++吗?
            for(q--; q >= p; q--) // 这里q >= p 是一直到q指到"e"这里的地址才会开始这个循环
            {
              putchar(*q);
            }
    */
   
    // 其实我觉得写成这样很好理解,上面的程序我刚开始都懵了,不知道要干什么
    char *q, *p = "Language";
    q = p; // q指向p的地址
    for(; p != "\0"; ++p) // 让p指向"Language"的末地址
    {
            ;
    }
    for(--p; p != q; ) // 从“Language”的末地址开始,一直到首地址结束,实现逆序打印
    {
        putchar(*(--p)); // 地址前移
    }
    return 0;
}

学编程的盆子 发表于 2021-2-27 10:55:19

巴巴鲁 发表于 2021-2-27 09:25
这里的指针指向的确实是单个字符,你理解的正确

#include<stdio.h>
int main()
{
      /*
    char *q, *p = "Language"; // 这里让p指向了"Langueage"的首地址 ,即*p = L
    for(q = p; q != "\0"; q++); // p的地址赋值给了q, q++不是相当于p++吗?
            for(q--; q >= p; q--) // 这里q >= p 是一直到q指到"e"这里的地址才会开始这个循环
            {
                putchar(*q);
            }
    */

老哥,按照您的理解,第一个for语句执行的时候 q++那么p同时也进行p++这样吗?对于这里还是不太能理解。

那么第二个for 的时候,循环条件是q >= p,既然如此,那由上一个for,p = q 应该此时的值是这样啊。

但是这里的p的初地址应该是p吧。

巴巴鲁 发表于 2021-2-27 17:48:51

学编程的盆子 发表于 2021-2-27 10:55
老哥,按照您的理解,第一个for语句执行的时候 q++那么p同时也进行p++这样吗?对于这里还是不太能理 ...


不是,是q=p时,让q这个临时指针来控制到达Language的末地址
而这个程序想实现逆序打印,肯定要知道这个字符串的首末地址
这样程序的首地址不会改变,又找到末地址,实现逆序打印

你看看我的那个程序,那样子来写可能更好理解
因为你这个程序不便于理解,而且执行时效率不高(外层循环最后一次才会开始执行内层循环)
页: [1]
查看完整版本: 求助一个字符指针的问题