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

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

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

黄舟
黄舟

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

全部回覆(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碼字,排版混亂還請見諒。


由此可見,傳入指針,可改變指針所指的物件。
傳遞到函數裡的參數(這裡是指標)是一個副本,函數執行完成後該副本就會被銷毀,從而使用最初的值。
此外,您可以嘗試使用指向指標的指標。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板