程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 詳解C說話中的常量指針和指針常量

詳解C說話中的常量指針和指針常量

編輯:關於C++

詳解C說話中的常量指針和指針常量。本站提示廣大學習愛好者:(詳解C說話中的常量指針和指針常量)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C說話中的常量指針和指針常量正文


概述
關於老手來講,指針在c說話裡老是一個異常難以懂得的概念。在這篇文章中,我們將說明常量指針,指針常量,const pointer to const(ps:樓主認為這可以翻譯成指向常量的常量指針)的差別

常量指針
讓我們先來懂得甚麼是常量指針。常量指針是指指針指向的地址是常量。換句話說,一旦常量指針指向了一個變量,你不克不及讓該常量指針指向其他變量了

常量指針的聲明辦法以下:

  <type of pointer> * const <name of pointer> 


常量指針聲昭示例:

  int * const ptr; 


讓我們用一小段代碼來講明常量指針:

  #include <stdio.h> 
   
  int main(void) 
  { 
    int var1 = 0, var2 = 0; 
   
    int * const ptr = &var1; 
   
    ptr = &var2; 
   
    printf("%d\n", *ptr); 
   
    return 0; 
  } 


在下面的例子中:

  •     我們界說了兩個變量var1和var2
  •     聲明一個常量指針ptr,並讓其指向var1
  •     然後,我們讓ptr指向var2
  •     最初,我們試圖打印這個指針指向的內容


簡而言之,我們界說了一個常量指針,而且試圖修正常量指針指向的地址

如今,讓我們來編譯這個法式:

所以,一旦常量指針指向了某一地址,我們不克不及更改常量指針的地址(ps:然則可以修正常量指針指向的內容)

指針常量
從名字中便可以顯著得出,一個指針,我們沒法修正指針指向的內容,這類指針就叫做指針常量。關於這類指針,你可以修正指針指向的地址,然則不克不及修正指針指向的內容

指針常量的界說以下:

  const <type of pointer> * <name of pointer> 

或許

  <type of pointer> const * <name of pointer> 


指針常量示例以下:

  const int *ptr; 

  int const *ptr; 


讓我們用一小段代碼來說明指針常量:

   

#include <stdio.h> 
   
  int main(void) 
  { 
    int var1 = 0; 
     
    const int *ptr = &var1; 
   
    *ptr = 2; 
   
    printf("%d\n", *ptr); 
   
    return 0; 
  } 


在下面代碼裡:

  •     我們界說了一個變量var1,並將其賦值為0
  •     我們界說了一個指針常量並讓它指向變量var1
  •     我們試圖修正指針常量指向的值
  •     打印指針常量指向的值


然後我們編譯下面的法式:

我們可以看到*ptr是只讀屬性。這意味著,假如指針常量指向了一個變量,我們不克不及修正該指針常量指向的值

指向常量的常量指針
假如你懂得了下面兩種指針類型,那作為上述兩種指針的混雜形狀,你也應當異常好懂得。指向常量的常量指針,你既不克不及修正指針的地址,也不克不及修正指針指向的內容

指向常量的常量指針界說以下:

  const <type of pointer> * const <name of pointer> 


示例:

  const int * const ptr; 


讓我們寫一小段代碼來懂得指向常量的常量指針:

  #include <stdio.h> 
   
  int main(void) 
  { 
    int var1 = 0, var2 = 0; 
   
    const int * const ptr = &var1; 
   
    *ptr = 1; 
   
    ptr = &var2; 
   
    printf("%d\n", *ptr); 
   
    return 0; 
  } 


在下面代碼中:

  •     我們聲清楚明了兩個變量var1和var2
  •     我們聲清楚明了一個指向常量的常量指針ptr,並讓ptr指向變量var1
  •     我們試圖修正指針的地址和指針指向的內容


當我們編譯這段代碼的時刻:

而C/C++中常把指針和常量混雜起來應用,其最年夜的用處就是作為函數的情勢參數,包管實參在被調函數中的弗成轉變的特征,那究竟常量指針和指針常量有甚麼差別呢?

總結
好了,如今來總結一下 常量指針 和 指針常量 的差別

起首必定要明確哪一種界說方法是常量指針,哪一種是指針常量,這裡可以記住三句話加深記憶:

* (指針)和 const(常量) 誰在前先讀誰 ;*意味著地址,const意味著內容;誰在後面誰就不許可轉變。

好吧,讓我們來看這個例子:

int a =3; 
int b = 1; 
int c = 2; 
int const *p1 = &b;//const 在前,界說為常量指針 
int *const p2 = &c;//*在前,界說為指針常量  



常量指針p1:指向的地址可以變,但內容弗成以從新賦值,內容的轉變只能經由過程修正地址指向後變換。  

  •     p1 = &a是准確的,但 *p1 = a是毛病的。
  • 指針常量p2:指向的地址弗成以從新賦值,但內容可以轉變,必需初始化,地址追隨平生。
  •     p2= &a是毛病的,而*p2 = a 是准確的。
  • 關於常量指針p1,我們可以轉變它指向的地址,但不克不及轉變指向的內容,假如轉變了,就會失足,上面是18行代碼撤消正文後編譯器提醒的毛病:

上面是在Vim編纂器中的調試成果

上述代碼在正文 18行 和 24行 代碼後能力准確輸入,下圖是准確成果

輸入成果可以看出,關於常量指針p1,轉變其地址指向,內容也跟著地址的轉變而變更了。

而關於指針常量p2,初始化後地址就固定了,內容可以隨時從新賦值。

關於常量指針p1,我們可以轉變它指向的地址,但不克不及轉變指向的內容,假如轉變了,就會失足,上面是18行代碼撤消正文後編譯器提醒的毛病:

輸入成果可以看出,關於常量指針p1,轉變其地址指向,內容也跟著地址的轉變而變更了。

而關於指針常量p2,初始化後地址就固定了,內容可以隨時從新賦值。

關於常量指針p1,我們可以轉變它指向的地址,但不克不及轉變指向的內容,假如轉變了,就會失足,上面是18行代碼撤消正文後編譯器提醒的毛病:


經由下面的引見,我想年夜家應當曉得常量指針和指針常量的差別了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved