1. 程式人生 > >const與指標及初始化

const與指標及初始化

1.常量本身必須初始化,因此對於本身是常量的指標,必須初始化,比如int* const p=&a;

2.對於指標本身不是常量,但是指向的物件是常量的指標,可以不初始化,比如const int *p、int const *p;

 const是一個C語言的關鍵字,它限定一個變數不允許被改變。使用const在一定程度上可以提高程式的安全性和可靠性

指向常量的指標

const int *pa;
int const *pa;
兩者等價。因為指向常量的指標有時候會指向常量,所以它具有這個性質:“不能靠解引用改變它指向的物件的值”,以此保護它所指向的常量的常量性:
*pa =d; // 不可行(d是已經宣告過的整型)

但指標本身的值是可變的:
pa=& d; // 可行(d是已經宣告過的整型)

而且指向常量的指標有時候也會指向變數,如下:
int t,u;
const int *pa;
pa =&t; //可行,指向變數t
pa =&u; //也可行,指向變數u

我們可以把它理解成:“為了指向常量而發明的指標”,這樣比較貼切。

常量指標:

int *const pa =&n; // n是之前已經宣告過的整型變數,注意必須是變數,理由見下

“常量指標”即指標本身的值是常量,但“能靠解引用改變它指向的物件的值”,如下:
pa=&d; // 不可行(d是已經宣告過的整型)
*pa =d; // 可行(d是已經宣告過的整型)

因為常量指標也是一種const常量,所以它同樣必須在第一次宣告時就初始化,不過它的初始值縮小為只能是變數(的地址),因為只有變數才能確保以後能靠解引用而改變它指向的物件的值。這使得常量指標不象一般的const常量,用變數或常量初始化都可以。
也就是說,常量指標反而總是指向變數的。

舉例:

typedef char * pStr;
char string[4] = "abc";
const char *p1 = string;
const pStr p2 = string;
p1++;
p2++;


  答案與分析:

  問題出在p2++上。

  1)、const使用的基本形式: const char m; 

  限定m不可變。

  2)、替換1式中的m, const char *pm; 

  限定*pm不可變,當然pm是可變的,因此問題中p1++是對的。

  3)、替換1式char, const newType m; 

  限定m不可變,問題中的charptr就是一種新型別,因此問題中p2不可變,p2++是錯誤的。

char *p = "i'm hungry!";
p[0]= 'I';


  答案與分析

  上面的程式碼可能會造成記憶體的非法寫操作。分析如下, “i'm hungry”實質上是字串常量,而常量往往被編譯器放在只讀的記憶體區,不可寫。p初始指向這個只讀的記憶體區,而p[0] = 'I'則企圖去寫這個地方,編譯器當然不會答應。
總結:

  1)、const在前面

const int nValue; //nValue是const
const char *pContent; //*pContent是const, pContent可變
const (char *) pContent;//pContent是const,*pContent可變
char* const pContent; //pContent是const,*pContent可變
const char* const pContent; //pContent和*pContent都是const

  2)、const在後面,與上面的宣告對等

int const nValue; // nValue是const
char const * pContent;// *pContent是const, pContent可變
(char *) const pContent;//pContent是const,*pContent可變
char* const pContent;// pContent是const,*pContent可變
char const* const pContent;// pContent和*pContent都是const

答案與分析:

  const和指標一起使用是C語言中一個很常見的困惑之處,在實際開發中,特別是在看別人程式碼的時候,常常會因為這樣而不好判斷作者的意圖,下面講一下我的判斷原則:

  沿著*號劃一條線,const和誰在一邊,那麼誰就是const,即const限定的元素就是它。你可以根據這個規則來看上面宣告的實際意義,相信定會一目瞭然。

  另外,需要注意:對於const (char *) ; 因為char *是一個整體,相當於一個型別(如 char),因此,這是限定指標是const。

相關推薦

const指標初始

1.常量本身必須初始化,因此對於本身是常量的指標,必須初始化,比如int* const p=&a; 2.對於指標本身不是常量,但是指向的物件是常量的指標,可以不初始化,比如const int *p、int const *p;  const是一個C語言的關鍵字,它

This指標成員資料初始

This指標與成員資料初始化 成員資料 預設初始化 在類中直接進行初始化 如:public int a = 3; 通過無參構造對資料進行初始化 舉例:public class Myclass(){    &nbs

結構體中的二級指標二級指標初始

int **temp;int i = 0;//初始化temp = new int*[100];for(i = 0; i < 100; i++)  temp[i] = new int[200];//釋放for(i = 0; i < 100; i++)  delete []temp[i];delete

多重繼承關系初始順序初始

java 所有 clas 屬性 配對 -- 如果 實現 硬盤 順序:父類屬性--> 父類構造方法--> 子類屬性--> 子類構造方法 初始化: 1.在創建類之前,檢查是否已加載檢查硬盤上的.class是否加載到內存中,如果沒有加載就先加載父類的文件,再加載

EF6 學習筆記(一):Code First 方式生成數據庫初始數據庫實際操作

view sqlserver 4.5 xpl 安裝 右鍵 ef6 字符串 ref 參考原文地址: https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-wit

定義結構體變量初始

style 不想 占用空間 clas 個學生 truct 學生 釋放 ring   雖然已經了解結構體類型,但是結構體類型變量的定義只有一種方法麽,這個當然不是的,所以我把我所知道的幾種方法列出來供給大家參考一下;   首先是第一種,也是我們經常用的一種: 1 #inc

接口初始順序

類與接口初始化順序一.類初始化順序:(Super的靜態變量和Super的靜態塊)->(Sub的靜態塊和Sub的靜態變量)->(Super的實例變量和Super的普通塊)->Super的構造器->(Sub的實例變量和Sub的普通塊)->Sub的構造器括號中的順序是與在類中的書寫順序

Java類對象初始的過程(一道經典的面試題)

java語法 ade 還要 body image LV 賦值 準備 new t 本文不再以ClassLoader的視角解釋這些問題。 首先,Java代碼有個特點,就是成員變量可以在前面的方法中使用,在後面定義。這一特性,很多人說Java了不起,可是為什麽呢?Java為何能夠

①操作系統安裝流程初始規範

①操作系統安裝流程及初始化規範v1.0-陳泰成-20180306v1.1-陳泰成-20180320 操作系統安裝流程 1 ) 調用cobbler-api安裝操作系統2 ) 調用saltstack-api進行系統初始化3 ) 調用dns-api解析主機名4 ) 調用zabbix-api對該

操作系統安裝安裝初始規範

系統安裝流程操作系統安裝安裝及初始化規範 V2.0 操作系統安裝流程 服務器采購 服務器驗收並設置raid 服務商提供驗收單,運維驗收負責人簽字 服務器上架 資產錄入 開始自動化安裝 將新服務器劃入裝機vlan 根據資產清單上的mac地址,自定義安裝。 1、機房 2、機房區域 3、機櫃 4、服務器位置

***靜態成員的定義初始 for c++ for新用法

用法 靜態數組 In const AI code 引用 clu RR 靜態成員的初始化要在類外不然報錯error: ISO C++ forbids in-class initialization of non-const static member ‘***‘ 但是聲明為

vue 環境的搭建初始項目

項目目錄 comm 初始 cmd .com config path init cache 其實超級簡單,雖然網上很多,但是我順便記錄下相當於做筆記吧 1nodejs 的安裝, 在node官網下載,點擊安裝,安裝的時候最好選擇路徑在d盤 2設置環境變量 我的電腦-->屬

CentOS-7-x86_64安裝初始

selection ngs linu software 啟動 wap 設置 系統默認 作用 --時區選擇:【Asia】【Hong Kong】 --最小化安裝:SOFTWARE SELECTION:選擇【Minimal Install】默認最小化安裝 --分區:SYSTEN

Java中成員變數、區域性變數、全域性變數、靜態變數存在位置初始

根據定義變數位置的不同,可以將變數分為成員變數和區域性變數。 成員變數是 定義在一個類的變數:類中方法外 區域性變數是定義在一個方法內的變數:方法中 成員變數分為: 靜態屬性:隨類的存在而存在,是在類載入的初始化 非靜態屬性:隨例項的屬性存在而存在。 區域性變數: 區域性變數不能加s

const修飾符、const指標一起使用(C++學習筆記 6)

一、 在C++中使用const修飾符來定義常量。(const來自單詞constant,是常量的意思) 用法:const 型別 常量名 = 表示式; 例如:const int LIMIT = 100; 這個常量LIMIT是有型別的,佔用儲存單元,有地址,可以用指標指向它,但不能修改它。

EMMC驅動中常用命令說明初始順序

一、命令說明 mmc_go_idle  傳送CMD0指令,GO_IDLE_STATE  使mmc card進入idle state。  雖然進入到了Idle State,但是上電覆位過程並不一定完成了,這主要靠讀取OCR的busy位來判斷,而流程歸結為下

Java中陣列的定義初始

文章目錄 1. 定義及初始化 1. 1動態初始化(宣告並開闢陣列) 1.2 靜態初始化 2. 引用傳遞 3. 二維陣列的基本瞭解 4. 陣列與方法的互操作 4.1 方法接收陣列

自定義結構體初始

自定義結構體及初始化,以及標頭檔案先宣告巨集,然後宣告結構體 <pre name="code" class="cpp">/********************** macro definition **********************/ #ifndef CVALGO_

使用二級指標初始一級指標

1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 enum 5 { 6 Success,NameErr,SexErr,StrNumErr,ScoreErr 7 }

Oracle中建立scott使用者表結構初始資料

文章目錄 1.部門表dept 2.僱員表emp 3.工資等級表salgrade 4.工資表bonus 由於安裝的是Oracle12c資料庫,沒有scott使用者。scott使用者中 dept、 emp、 salgrade、 b