程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言const與指針——為什麼不能用char **給const char **賦值

C語言const與指針——為什麼不能用char **給const char **賦值

編輯:關於C語言

 

C語言中,const限定詞指定了一個不可修改的變量,但並不是常量。它可以使編譯器幫助我們保證某些變量不被意外修改,例如指針或引用傳遞時,加上const可保證我們的源數據不被破壞。const修飾指針時情況比一般情況下要復雜許多,先看下面這個例子:

1 const char * p1;//p1指向的內容不可變

2 char const * p2;//p2指向的內容不可變

3 char * const p3;//p3不可變,但其指向的內容可變

通過注釋可以看出,當const在*前時,其修飾的是指針指向的內容,但指針本身是可變的,我們可以用它來遍歷一個源數組或其他一組不想被意外破外的數據;當const在*後時,其修飾的是指針本身,但其指向的內容是可變的,在這個意義上,它類似於數組名,但二者並不完全等價。

在任何情況下,都可以向const T類型的指針傳入T型的指針(T表示任意數據類型),但反過來卻不行。原因很簡單,如果反來過可行,我們就可以借助普通指針來修改const型指針指向的 內容,這恐怕不是我們想要的結果。但是這條規則是否適用於const修飾的二級指針呢?比如給const char **的指針傳入一個char **的值,會不會保證萬無一失呢?這種情況下編譯器一般會給出一個warning,曾以為這個warning是無關緊要的,只是編譯器太敏感了,只到後來 看來這個例子,我才仿佛明白了什麼:

1 const char c ='x';

2 char *p1;

3 const char **p2 = p1;//用char **的值賦給const char **

4 *p2 = &c;//用const char * 給const char *賦值,完全沒問題

5 *p1 = 'y';//給char *指向的內容賦值,沒問題!但這兒會發生什麼事情

除了第3行出有一個warning外,其余的都沒任何問題,但是經過第4步的操作,p1已經指向的c,這是一個不可修改的變量,第5步!!!天哪,我干了些什麼??

本文出自 “學須靜也” 博客

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