我已經撰寫了使用指標通常傳遞值的代碼 我的問題是如何傳遞這些值,即 a & b 作為常量指標,如果還沒有的話。
void swap(int *x, int *y)
{
int tmp;
tmp = *x;
*x = *y;
*y = tmp;
return;
}
int main () {
int a = 20;
int b = 12345;
printf("Before swap, value of a : %d\n", a );
printf("Before swap, value of b : %d\n", b );
swap(&a, &b);
printf("After swap, value of a : %d\n", a );
printf("After swap, value of b : %d\n", b );
return 0;
}
uj5u.com熱心網友回復:
const在 C 中,一般跟在型別之后,并且*是型別的一部分,所以整型指標常量的型別宣告是:
int * const
您可能已經嘗試過int const *,但發現它不起作用。那是因為,重復一遍,通常const適用于它左邊的東西。
意見:這就是為什么我討厭const先寫的模式,比如const int。它之所以有效,是因為該語言有一個特殊情況——如果 左邊沒有const,它適用于右邊的東西——而且由于大多數人通過示例學習,const型別宣告開頭的每一次出現都有助于錯誤地教導試圖學習語言的人。
提示:我喜歡閱讀并說const“which is constant”,因為該短語清楚地指代它之前的事物,因此它與型別宣告各部分的從左到右的順序相匹配:int const然后讀作“一個整數是常數”,int * const讀作“一個常數的整數地址”。
將它與您的swap功能結合起來,我們得到
void swap(int * const x, int * const y)
意見:這也是我不喜歡*在宣告中“觸及”這個名字的原因。我這樣做int * foo不是int *foo因為它與其他型別宣告int * const foo(如*foo.
但是你應該知道,在 C 中,或者至少在所有真實的和最可以想象的 C 實作中,它實際上并沒有改變代碼行為來生成函式引數const像那樣 - 引數本身是函式私有的,所以函式不能改變它。它可以對實際代碼產生實際影響的唯一方法是,如果你有一個 C 編譯器,如果你告訴它它不會修改自己的引數,它可以更好地優化一個函式,但大多數優化編譯器只會注意到如果一個引數沒有在函式中被修改。當然,它仍然可以作為一種有用的方式告訴人們閱讀您的代碼您對引數的意圖是什么,并且如果您有在沒有特定意圖更改它們時宣告事物的習慣,那么您更有可能讓計算機捕獲某些錯誤(例如,如果您有一個與函式中的變數命名相似的引數,并且您的意思是修改一個但意外鍵入了另一個 - 如果另一個是const,簡單的工具可以捕捉錯誤)。
uj5u.com熱心網友回復:
引數按值傳遞,值不是const或非const;只有物件可以這樣限定。您可以限定函式引數(它們是初始化為引數值的物件),這僅意味著函式不會更改引數的值:
void swap(int * const x, int * const y)
{
// x and y are not changed, although the objects they point to are changed.
int temporary = *x;
*x = *y;
*y = temporary;
}
如果你想讓引數型別指標指向const物件,那也是可能的。只要指標指向一個沒有用 定義的物件,就定義const了通過轉換移除const并使用它來修改物件的行為:
void swap(const int *x, const int *y)
{
/* ncx and ncy are set to the original pointers to non-const
that became the pointers to const that are x and y.
*/
int *ncx = (int *) x, *ncy = (int *) y;
int temporary = *ncx;
*ncx = *ncy;
*ncy = temporary;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/455287.html
上一篇:包含位域的結構的大小
