const在c語言中是表示道義上保證變數的值不會被修改,並不能實際阻止修改,通過指標可以修改常變數的值,但是會出現一些不可知的結果。幾種情況不同,我們乙個乙個來看。
1、直接賦值
const
inta=3
;a=5
;// const.c:6:2: error: assignment of read-only variable 『a』
這種情況不用多說,編譯錯。
2、使用指標賦值,
@孫健波提到的方法,在gcc中的warning,g++中出現error,是因為**寫得不對,由非const的變成const不用顯式的轉換,const變為非const需要顯式轉換,這種情況應當使用顯式的型別轉換。
const
inta=3
;int*b
=(int*)&
a;printf
("a = %d, *b = %d\n"
,a,*
b);*b
=5;printf
("a = %d, *b = %d\n"
,a,*
b);
執行結果(注:使用msvc編譯的結果一致):
$ gcc const.c
$ ./a.out
a = 3, *b = 3
a = 5, *b = 5
$ g++ const.cpp
$ ./a.out
a = 3, *b = 3
a = 3, *b = 5
這裡使用g++編譯時,a的值之所以沒有改變,是因為編譯時a是常量,然後被編譯器編譯為立即數了。因此對使用b指標修改不會更改a的值。
值得注意的是,如果a被定義為全域性常變數,使用指標修改會引發segment fault。
在函式的原型中,我們也常用const修飾指標,表示函式的實現者在道義上不會去修改這個指標所指向的空間。例如我們熟知的strcpy函式,原型如下:
char
*strcpy
(char
*dst
,const
char
*src
);
傳入的引數src型別是const char*,表示函式內部實現不會修改src所指向的空間。之所以說是道義上,是因為在內部通過上述指標強制型別轉換的方式可以修改該空間的值。另外,如果我們宣告了我們不會修改傳入指標的所指向的空間,那麼我們也不應當去修改這塊空間,因為這個傳入的指標可能會是乙個不可寫的記憶體,然後出現段錯誤。
C語言 結構體變數位址
includetypedef struct student stu intmain 陣列名 陣列位址 陣列第乙個元素的位址 陣列第乙個元素的第乙個成員的位址 printf 張三位址 d n edu printf 張三位址 d n edu printf 張三位址 d n edu 0 printf 張三...
c語言中返回的變數位址,其實體地址在?(刨根問底)
首先明確一點c語言中返回來的位址是虛擬位址 邏輯位址 虛擬位址和實體地址之間的轉化是作業系統自動進行完成的。邏輯位址,是作業系統 分配給你可執行程式的實體地址空間上對映出來的邏輯位址。一般地邏輯位址和實體地址沒有直接的關係,這個轉換由作業系統完成並維護,與你的程式無關。特殊地某些位址,比如說中斷向量...
C語言中Const指標變數(常指標)
c語言中,指標是最難理解的一部分,尤其是const指標變數。include stdafx.h int main int argc,char argv 定義基本型別的const變數,const 位置在哪兒都可以 const int x 2,y 3 兩個常量 定義乙個非const變數 int z 3 乙...