2012-02-15 101 views

回答

4

是的,你可以修改p。但是,它在呼叫者中不會改變。 C是一種通過價值的語言。查看C FAQ,該FAQ有一個關於exactly this situation的問題。

+0

那麼,在那種情況下,你不能,因爲它聲明'const',但通常是yep - 見上面。 – jka6510 2012-02-15 01:22:43

+0

良好的電話 - 我會解決這個問題。 – 2012-02-15 01:23:02

+0

爲什麼不能修改'help'中的'p'副本?聲明中的「const」只應表示「p」指向常量數據,因此不應允許使用「* p = 5」這樣的語句。 – 2012-02-15 01:59:46

1

在這種情況下,由於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都不會修改內存中的其他位置對調用方不可見。

1

理解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

+0

我有點困惑。所以如果它是「int const * p;」我可以改變* p的值,但是我可以改變它在內存中的位置,以及「int * const p;」的相反位置。 – 2012-02-15 02:26:21

+0

是的。 'int const * p'/'const int * p'表示您可以更改'p',但不更改'* p'。和'int * const p'相反。 – 2012-02-15 08:56:49

相關問題