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;
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