有些東西,當我將它們傳遞給函數時,我仍然不太明白指針。 如果申報像傳遞指針作爲函數參數的語義是什麼?
void help (const int *p)
功能我可以修改參數p
功能help
內? 我可以更改指針所指的內容嗎?
感謝您的澄清。
有些東西,當我將它們傳遞給函數時,我仍然不太明白指針。 如果申報像傳遞指針作爲函數參數的語義是什麼?
void help (const int *p)
功能我可以修改參數p
功能help
內? 我可以更改指針所指的內容嗎?
感謝您的澄清。
是的,你可以修改p
。但是,它在呼叫者中不會改變。 C是一種通過價值的語言。查看C FAQ,該FAQ有一個關於exactly this situation的問題。
在這種情況下,由於p
被聲明爲const int *
,所以修改p
的嘗試將被編譯器拒絕。
但是,如果p
是一個普通的舊int *
,您可以修改p
指向的東西,並且調用者會注意到。假設你寫道:
void foo(void) {
int n = 100;
help1(&n);
printf("n = %d", n);
n = 100;
help2(&n);
printf("n = %d", n);
}
void help1(int *p) {
*p = 50;
}
void help2(int *p) {
p = (int *)malloc(sizeof(int));
*p = 50;
free(p);
}
然後調用foo()
會導致你的程序打印
n = 50
n = 100
在這個程序中,help1
改變件事p
點,調用者可以看到它。另一方面,help2
使p
指向內存中的不同位置,並且任何help2
都不會修改內存中的其他位置對調用方不可見。
理解C中常量符號的最簡單方法就是大聲說出聲明。先從名稱,轉至左:
const int *p; // 'p' is a pointer to an int that is const
這是相等的方式:
int const *p;
這表明,你可以改變在什麼p個點,但你不能改變它什麼指向。所以你有隻讀訪問權限。但是,如果你有這樣的事情:
int * const p; // 'p' is a const pointer to an int
...然後你可以改變指向的內存由對儘可能多的,只要你想,但你不能改變p
。
我有點困惑。所以如果它是「int const * p;」我可以改變* p的值,但是我可以改變它在內存中的位置,以及「int * const p;」的相反位置。 – 2012-02-15 02:26:21
是的。 'int const * p'/'const int * p'表示您可以更改'p',但不更改'* p'。和'int * const p'相反。 – 2012-02-15 08:56:49
那麼,在那種情況下,你不能,因爲它聲明'const',但通常是yep - 見上面。 – jka6510 2012-02-15 01:22:43
良好的電話 - 我會解決這個問題。 – 2012-02-15 01:23:02
爲什麼不能修改'help'中的'p'副本?聲明中的「const」只應表示「p」指向常量數據,因此不應允許使用「* p = 5」這樣的語句。 – 2012-02-15 01:59:46