今天碰到了一个简单的题,可是我却有点不理解,代码是这样的:
#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的地址呢?若是,则为什么不能正确运行?
我感觉这个题目很基础了,可是我却似乎没有学透,请问我下一步要怎么加强对指针的理解呢?
谢谢大家。
第一,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
;注意*
加上指標變數才是指向這個位址(指標)裡面的值。因為跨函數改值通常是由位址來鎖定值,進而才能改值。所以可以這樣改:你錯在 你直接寫 p = p+1;實際上是試圖改變的你新定義的指標變數。你應該是沒有學C 就直接學C++的吧,還是C的指標沒學好?
手機端+C4Droid碼字,排版混亂還請見諒。


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