日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

const int *a和int*const a 的区别详解

發布時間:2023/12/13 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 const int *a和int*const a 的区别详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

補充知識

  • “const int i”與“int const i”之間的區別
  • 對變量來說,const 關鍵字可以限定一個變量的值不允許改變,從而保護被修飾的東西,防止意外修改,在一定程度上可以提高程序的安全性和可靠性。

代碼

const int *

int i1 = 10; int i2 = 20; const int *p = &i1; /* 輸出結果是10 */ printf("%d\n", *p); p = &i2; /* 輸出結果是20 */ printf("%d\n", *p); i2 = 30; /* 輸出結果是30 */ printf("%d\n", *p);
  • 為什么 p 的值是可以被修改的,它可以重新指向另一個地址呢
  • 這里的 const 關鍵字修飾的是整個“*p”,而不是 p。所以這里的“*p”是不能被賦值的,也就是說我們不能通過“*p”來修改 i2 的值。
  • 其次,p 前并沒有用 const 關鍵字進行修飾,所以 p 是指針變量,能被賦值重新指向另一內存地址。也就是說下面的代碼是合法的:p = &i2; i2 = 30;
  • “int*const p”這種聲明形式。很顯然,這里的 const 是寫在 p 前和 * 號后的,而不是寫在“*p”前的,所以它是用來修飾限定 p 的

int *const

int i1 = 10; int i2 = 20; int *const p = &i1; /* 輸出結果是10 */ printf("%d\n", *p); /* p=&i2; p不能再這樣重新賦值了,即不能再指向另一個新地址*/ /* 可以通過*p修改i1的值*/ i1 = 30; /* 輸出結果是30 */ printf("%d\n", *p);
  • p 因為有了 const 的修飾,所以只是一個指針常量。因此,這里的 p 值是不能重新賦值修改的,它只能永遠指向初始化時的內存地址。即下面的代碼是不合法的:
  • p = &i2; //p不能再這樣重新賦值了,即不能再指向另一個新地址
  • 但是,也正因為這里的整個“*p”的前面沒有 const 修飾。也就是說,“*p”是變量而不是常量,所以我們可以通過“*p”來修改它所指內存 i1 的值。因此,下面的語句是合法的:
  • 由此可見,如果關鍵字 const 直接寫在“*p”前,則程序不能修改“*p”,但可以修改 p;如果關鍵字 const 直接寫在 p 前,則程序不能修改的是 p,但可以通過“*p”來修改它所指內存的值。理解這兩點很重要,否則很難掌握“const int*p”與“int*const p”兩者之間的根本區別。

總結

const int i=10; int *p; /* 強制類型轉換*/ p= (int *) &i; printf("*p=%d\n",*p) /*這種賦值是合法的*/ *p=20; printf("i=%d\n",i); printf("*P=%d\n",*p);
  • 因為 const int 類型的 i 的地址是不能賦值給指向 int 類型地址的指針 p 的(否則 p 豈不是能修改i的值)。因此下面的語句是不合法的:p = &i
  • 可以通過強制類型轉換進行賦值,因此下面的這種賦值方法是合法的? p= (int *) &i;? *p=20;
  • 盡管可以通過強制類型轉換進行賦值,也不能通過“*p=20”來修改 i 的值。因此,“printf("i=%d\n”,i)”輸出的結果是 10,并不是 20。
  • 示例運行結果為:*p=10? i=10? *p=20

第一個是指針,第二個是指針所指物

p是指指針,*p是指指針所指物

const *p,限制的是(*p),*p不可以動,p可以動

* const? p 限制的是(p),p不可以動,*p可以動

參考鏈接

  • C語言const int *a和int*const a 的區別詳解

總結

以上是生活随笔為你收集整理的const int *a和int*const a 的区别详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。