1. 程式人生 > >c語言中const 型別變數地址賦值給指標。

c語言中const 型別變數地址賦值給指標。

const在C語言中是表示道義上保證變數的值不會被修改,並不能實際阻止修改,通過指標可以修改常變數的值,但是會出現一些不可知的結果。幾種情況不同,我們一個一個來看。

1、直接賦值
const int a = 3;
a = 5;
// const.c:6:2: error: assignment of read-only variable ‘a’
這種情況不用多說,編譯錯。

2、使用指標賦值,@孫健波提到的方法,在gcc中的warning,g++中出現error,是因為程式碼寫得不對,由非const的變成const不用顯式的轉換,const變為非const需要顯式轉換,這種情況應當使用顯式的型別轉換。
const int
a = 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言中const 型別變數地址指標

const在C語言中是表示道義上保證變數的值不會被修改,並不能實際阻止修改,通過指標可以修改常變數的值,但是會出現一些不可知的結果。幾種情況不同,我們一個一個來看。 1、直接賦值 const int a = 3; a = 5; // const.c:6:2: error: assignment of read

C言中,為什麼字串可以字元指標變數

1.以字串形式出現的,編譯器都會為該字串自動新增一個0作為結束符,如在程式碼中寫  "abc",那麼編譯器幫你儲存的是"abc\0" 2."abc"是常量嗎?答案是有時是,有時不是。 不是常量的情況:"abc"作為字元陣列初始值的時候就不是,如                  char str[] = "

C言中struct陣列亂序

static struct resource s3c_wdt_resource[] = { [0] = { .start = S3C24XX_PA_WATCHDOG, .end = S3C24XX_PA_WATCHDOG + S3C24XX

C言中register型別變數有什麼意義

一般情況下,變數的值是儲存在記憶體中的,CPU 每次使用資料都要從記憶體中讀取。如果有一些變數使用非常頻繁,從記憶體中讀取就會消耗很多時間,例如 for 迴圈中的增量控制: int i; for(i=0; i<1000; i++){ // Some Cod

轉載 C言中register型別變數有什麼意義

一般情況下,變數的值是儲存在記憶體中的,CPU 每次使用資料都要從記憶體中讀取。如果有一些變數使用非常頻繁,從記憶體中讀取就會消耗很多時間,例如 for 迴圈中的增量控制: int i; for(i=0; i<1000; i++){ // Some C

C言中const關鍵字

關鍵字const用來定義常量,如果一個變數被const修飾,那麼它的值就不能再被改變,我想一定有人有這樣的疑問,C語言中不是有#define嗎,幹嘛還要用const呢,我想事物的存在一定有它自己的道理,所以說const的存在一定有它的合理性,與預編譯指令相比,const修飾符有以下的優點

C言中static全域性變數與普通的全域性變數區別

下面是中興通訊2012校招筆試題的一道問答題: 1. static全域性變數與普通的全域性變數有什麼區別 ?   全域性變數(外部變數)的說明之前再冠以static 就構成了靜態的全域性變數。   全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。 這兩者在儲存方式上

C言中const的使用

一、作為常量使用 可以使用const關鍵字對變數加以限定: const int MaxNum = 100; //班級的最大人數 這樣 MaxNum 的值就不能被修改了,任何對 MaxNum 賦值的行為都將引發錯誤: MaxNum

C言中const關鍵字的用法

關鍵字const用來定義常量,如果一個變數被const修飾,那麼它的值就不能再被改變,我想一定有人有這樣的疑問,C語言中不是有#define嗎,幹嘛還要用const呢,我想事物的存在一定有它自己的道理,所以說const的存在一定有它的合理性,與預編譯指令相比

C言中 char 型別的取範圍為什麼是-128~127

我們之前已經說過關於原碼、反碼和補碼的一些東西,如果你沒有看過,可以點這裡《 你知道原碼、反碼和補碼嗎,進來了解一下吧 》看一下 。 好了,可能你不會太想看,所以我們一起再來簡單的複習一下,如果我們現在有一個十進位制的整數 1 ,我們知道 1 個位元組等於 8 位,

C言中constC++中const關鍵字的區別

# include "iostream" using namespace std; struct Teacher {     char name[30];     int age; }; void operatorTeacher(Teacher *pT) {   

C言中const用法解析

const修飾的變數儲存位置,和不用const修飾的沒區別!!!!!! 關鍵字const用來定義常量,如果一個變數被const修飾,那麼它的值就不能再被改變,我想一定有人有這樣的疑問,C語言中不是有#define嗎,幹嘛還要用const呢,我想事物的存在一定有它

C言中const有什麼用途

const修飾的資料型別是指常型別,常型別的變數或物件的值是不能被更新的。 const關鍵字的作用主要有以下幾點: (1)可以定義const常量,具有不可變性。 例如: const int Max=100; int Array[Max]; (2)便於進行型別檢查,使編譯

C言中的static變數

歡迎交流 E-mail:ce123#126.com(#->@) QQ:350725201 嵌入式開發交流群: (1)280352802(已滿) (2)289195589 宣告:版權所有,歡迎轉載! 轉載請註明出處:http://blog.csdn.net/ce123

變數地址另一個變數C通過,C++編譯出錯

 取變數的地址賦值給另一個變數,C通過。正常執行,C++編譯出錯。 程式碼如下: #include <stdio

Java中兩個byte型別相加結果byte型別變數會報編譯錯誤,byte加byte的結果為什麼是int?

背景: 之前偶然看到有討論這個問題,在網上搜了半天,結果都不盡如人意,解釋沒有到位, 有的說byte加byte預設就是int,那為什麼這麼做呢? 這不是找麻煩麼?這種奇怪的預設還有哪些?帶來一些列疑問。。。。。。 有的說byte儲存的就是整型資料,這種說法的對錯姑且不論,至少我覺得難免有

C語言中結構體變數之間

/********************************************************************** * 版權所有 (C)2015, Zhou Zhaoxiong。 * * 檔名稱:Struct2Struct.c * 檔案標識:無 * 內容摘要:結構體變數之間的賦值

C言中,int的最大與最小

1. 有符號數:          分析:計算機中有符號整數是用補碼錶示的。          對於有符號的n位二進位制數的其取值範圍為:最小值:-2^(n-1);  最大值:2^(n-1) -1; 2.無符號數: 對於無符號的n位二進位制數的其取值範圍為:     最小

c言中32為地址型別轉換為64位整數型別

uint64_t idt_operand = ((sizeof(idt) - 1) | ((uint64_t)(uint32_t)idt << 16)); idt是陣列名,也就是結構陣列型別的指標。static struct gate_desc idt[IDT

C言中,通過指標結構體中的變數

typedef struct Mech_Para// { int32_tP001_TipBoxX; int32_tP002_TipBoxY; int32_tP003_TipBoxZ; int32_tP004_IntervalX; int32_tP005_IntervalY;