V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
HxSeek
V2EX  ›  程序员

C 语言指针问题

  •  
  •   HxSeek · 2015-04-02 11:01:47 +08:00 · 3631 次点击
    这是一个创建于 3526 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我觉得这样子做的话··输出的答案应该会是 s1变成bstring1 s2变成astring2才对, 可是调试的时候,发现那句话错了··请问是为什么?导致它们之间不能互相赋值?

    代码如下:

    include<iostream>

    using namespace std;

    void exchange(char *a,char *b)
    {
    char c;
    c = *a;
    *a = *b; //为什么这句话会错
    *b = c;
    }

    int main()
    {
    char *s1 = "atring 1";
    char *s2 = "btring 2";

    exchange(s1,s2);
    cout << s1 << endl;
    cout << s2 << endl;
    
    return 0;
    

    }

    21 条回复    2015-04-03 08:05:07 +08:00
    rrfeng
        1
    rrfeng  
       2015-04-02 11:07:21 +08:00
    char *a; //a 是一个指针
    char c = *a; // 将指针的指针丢给了 c

    &a 才是指针指向内容的引用。
    sinxccc
        2
    sinxccc  
       2015-04-02 11:09:45 +08:00   ❤️ 1
    *a 是指针指向的内容,而这个内容是个字符串常量,是不可以修改的。
    jiang42
        3
    jiang42  
       2015-04-02 11:33:44 +08:00   ❤️ 1
    fix:
    char s1[] = "atring 1";
    char s2[] = "btring 2";

    @rrfeng 似乎说错了?
    gdqyn
        4
    gdqyn  
       2015-04-02 11:50:30 +08:00
    二楼说的对,如果把形参改为传入引用,然后交换指针指向的内容就可以了
    void exchange(char *&a,char *&b)
    {
    char *c;
    c = a;
    a = b; //为什么这句话会错
    b = c;
    }

    用char *指向字符串会报警告(虽然程序员不在乎警告)

    完整的
    #include <iostream>
    using namespace std;

    void exchange(const char *&a, const char *&b)
    {
    const char *c;
    c = a;
    a = b; //为什么这句话会错
    b = c;
    }

    int main()
    {
    const char *s1 = "atring 1";
    const char *s2 = "btring 2";

    exchange(s1,s2);
    cout << s1 << endl;
    cout << s2 << endl;

    return 0;
    }
    Andiry
        5
    Andiry  
       2015-04-02 11:52:14 +08:00   ❤️ 1
    s1和s2是常量指针,内容不能修改
    cheng007
        6
    cheng007  
       2015-04-02 12:02:54 +08:00
    @rrfeng 你说的不对
    @Andiry 你说的对。
    好久没有写c代码了,细节都忘记差不多了。
    这样就是OK的,s1, s2的内存是栈内存。
    void exchange(char *a, char *b)
    {
    char c;
    c = *a;
    *a = *b;
    *b = c;
    }

    int main()
    {
    char s1[] = "astring";
    char s2[] = "bstring";
    exchange(s1, s2);
    printf("str1 %s , str2 %s", s1, s2);
    return 0;
    }
    fliar
        7
    fliar  
       2015-04-02 12:14:43 +08:00   ❤️ 1
    我想你理解了指針就是地址,但是有点把c想得太智能了*a = *b是不会复制整个字符串的,出错原因楼上@Andiry说了
    手动复制一般用memcpy复制内容,当然这个例子用楼上@gdqyn换址比较好
    我其实建议新手上路还是std::string比较省心,当然如果这个是你作业要求那当我没说
    HxSeek
        8
    HxSeek  
    OP
       2015-04-02 12:20:16 +08:00
    谢谢大家··我懂了
    Andiry
        9
    Andiry  
       2015-04-02 12:21:51 +08:00
    @cheng007 你这么写也是错的,只不过交换了s1和s2的第一个字符而已
    rrfeng
        10
    rrfeng  
       2015-04-02 12:42:20 +08:00
    谢谢大家,我也懂了……
    Comdex
        11
    Comdex  
       2015-04-02 12:42:28 +08:00
    帖子中的是c++吧?
    cheng007
        12
    cheng007  
       2015-04-02 13:02:09 +08:00
    @Andiry 我没有说要交换字符串啊,按照他的写法写而已。
    Andiry
        13
    Andiry  
       2015-04-02 13:08:41 +08:00
    @cheng007 你说得对,我被误导了,以为他要交换两个字符串
    blackboom
        14
    blackboom  
       2015-04-02 13:16:19 +08:00 via Android
    *a代表取值,*b也是,把常量赋值给常量,当然不可以
    icedx
        15
    icedx  
       2015-04-02 13:29:54 +08:00 via Android
    char* c;
    c = a;
    a = b;
    b = c;
    C++ 少用指针 引用才是正途
    ibudao
        16
    ibudao  
       2015-04-02 13:29:57 +08:00
    等号(=)左边的只能是左值,左值映射的是一段内存区域,而等号右边既可以为左值,也可以为右值。记住这个就行了。
    hualuogeng
        17
    hualuogeng  
       2015-04-02 13:38:29 +08:00
    @gdqyn 你的程序和楼主要的效果不一样,楼主就是想交换两个字符串的第一个字符。

    再者,没有说程序员就不关心warning的,编译器发出告警并不是为了刷存在感。
    linux40
        18
    linux40  
       2015-04-02 20:06:58 +08:00
    不要使用char *s1 = "atring 1",它只是声明了一个指针,但"xxx"是常量表达式,话说书上将常量和指针的时候都有写啊。。。
    lirau
        19
    lirau  
       2015-04-03 00:49:51 +08:00 via Android
    从这个问题可以看出本社区人员水平的参差不齐啊
    lirau
        20
    lirau  
       2015-04-03 00:55:37 +08:00 via Android
    danny200309
        21
    danny200309  
       2015-04-03 08:05:07 +08:00
    #include <stdio.h>
    #include <iostream>

    using namespace std;

    void exchange(char *a, char *b)
    {
    char c[] = "ctring";
    *c = *a;
    *a = *b;
    *b = *c;
    }

    int main()
    {
    char s1[] = "atring";
    char s2[] = "btring";

    exchange(s1,s2);
    std::cout << s1 << std::endl;
    std::cout << s2 << std::endl;

    return 0;
    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5576 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 06:38 · PVG 14:38 · LAX 22:38 · JFK 01:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.