正如其他人所說的那樣,函數是這樣聲明的,所以在函數的範圍內,該變量不會變化,這樣編譯器會警告你。至於爲什麼你可能想要這樣做,考慮一下傳遞一個指針允許你做什麼 - 也就是說,你可以取消引用已經傳遞的指針並編輯它所指向的數據的值。使用const是防止自己意外編輯調用者認爲未改變的東西的值的好方法。
例如,考慮一下:
#include <stdio.h>
void add(int* result, const int* x, int* y)
{
*result = *x + *y;
(*y)++; /* <-- the caller won't expect this! */
}
int main(int argc, char** argv)
{
int a = 7;
int b = 10;
int c = 0;
add(&c, &a, &b);
printf("%d + %d = %d\n", a, b, c);
return 0;
}
該吐出7+11=17
。現在,這是一個簡單的,不嚴重的情況下,但各種東西可能是我們要依靠什麼重要的事發生......
如果你堅持常量對變量y,你應該得到:
constexample.c: In function ‘add’: constexample.c:7:5: error: increment of read-only location ‘*y’
編輯,進一步澄清:
一個很好的理由來聲明const
類型的非指針變量是表示某物的大小,或者保持陣列的最大值的任何變量的變量。考慮:
int editstring(char* result, ..., const char* source, const size_t source_len);
現在,你對自己說,但我永遠不會編輯source_len
。那麼,讓我們說你的算法,無論出於何種原因。如果您的更改增加了source_len的值,則存在超出您分配的內存訪問內存的風險。設置const
如果您嘗試修改該值,則會生成編譯器錯誤。
我應該在雙重下劃線中指出,const只是向編譯器說的一種方式:「我保證不編輯它」。它不保證內存是只讀,但它是一種標記您的意圖的方式,以便捕獲錯誤。如果您不需要修改它,請將其聲明爲const。
而且由於您問了,兩個版本生成的程序集是相同的。
在您的示例中,您不聲明參數'const',而是聲明參數指向的數據。對於指針而言,OP所要求的內容就像'int * const result'。另外,如果我沒有記錯,'* y ++'首先增加指針,然後解除引用。沒有什麼可以打擾來電者,不是嗎? –
你是對的,我的錯誤應該是'(* y)++;'但是,我從來沒有說過,聲明我的參數const影響指針 - 實際上,我的例子中的*點*是它改變了源內存。儘管我已經在標準變量consts的有用性上添加了一個額外的部分。 – 2011-01-13 17:38:30