c++ - 关于c语言指针的一个简单问题
黄舟
黄舟 2017-04-17 14:33:07
0
3
356

今天碰到了一个简单的题,可是我却有点不理解,代码是这样的:

#include<iostream>
void inc(char *p)
{
    p = p + 1;
}
int main()
{
    char s[] = { '1', '2', '3' };
    inc(s);
    std::cout << *s << std::endl;
    return 0;
}

需要你判断输出的是什么。
我很确定若想输出‘2’,则inc函数内的代码应该是:

*p=*(p+1);

但是为什么源代码就不能正确run了呢?s本身就是指向数组的第一个元素的指针,我的inc中取的是不是p的地址呢?若是,则为什么不能正确运行?
我感觉这个题目很基础了,可是我却似乎没有学透,请问我下一步要怎么加强对指针的理解呢?
谢谢大家。

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

Antworte allen(3)
PHPzhong

第一,s不可变;
第二,c语言是值传递,你的inc里的s是s的副本,并不能对s有何影响;
第三,你确信的写法确实输出2,但是你是把s[1]赋值给了s[0].

左手右手慢动作

稍微改下,你知道 s实际就是个地址(指针),而且指向的是第一个字节,&s[0] == s。那么要改变其里面的值,最终就应该是 *P = 2;比如 int i =1;在跨函数改变这个值得时候 就要引用其地址 比如 int * p = &i ,并且这样写 *p = 2;这里 *p==i;注意 *加上指针变量才是指向 这个地址(指针)里面的值。因为跨函数改值通常是由地址来锁定值,进而才能改值。所以可以这样改:

#include<iostream>
    void inc(char *p)
    {
        *p = *p + 1;
    }
    int main()
    {
        char s[] = { '1', '2', '3' };
        inc(s);
        std::cout << *s << std::endl;
        return 0;
    }
    

你错就错在 你直接写 p = p+1;实际是试图改变的你新定义的指针变量。你应该是没有学C 就直接学C++的吧,还是C的指针没学好?

左手右手慢动作

手机端+C4Droid码字,排版混乱还请见谅。


由此可见,传入指针,可以改变指针所指的对象。
传递到函数里的参数(这里是指针)是一个副本,函数执行完成后该副本就会被销毁,从而使用最初的值。
此外,您可以尝试使用指向指针的指针。

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage