suchen

Heim  >  Fragen und Antworten  >  Hauptteil

c++ - 关于c语言指针的一个简单问题

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

#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的地址呢?若是,则为什么不能正确运行?
我感觉这个题目很基础了,可是我却似乎没有学透,请问我下一步要怎么加强对指针的理解呢?
谢谢大家。

黄舟黄舟2773 Tage vor359

Antworte allen(3)Ich werde antworten

  • PHPz

    PHPz2017-04-17 14:35:07

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

    Antwort
    0
  • ringa_lee

    ringa_lee2017-04-17 14:35:07

    稍微改下,你知道 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的指针没学好?

    Antwort
    0
  • ringa_lee

    ringa_lee2017-04-17 14:35:07

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


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

    Antwort
    0
  • StornierenAntwort