1. 程式人生 > >C語言——常量指標、指標常量以及指向常量的指標常量三者區別詳解

C語言——常量指標、指標常量以及指向常量的指標常量三者區別詳解

C語言——常量指標和指標常量的區別

常量指標、指標常量以及指向常量的指標常量概念簡要描述

常量指標:表示const修飾的為所申明的型別。
例如:

//注意char const *p與const char *p效果相同。
void consttest(const char *p)  
{ 
    printf("p[1]=%c\n",p[1]); 
    p=1;//正確
    *(p+1)='a';//錯誤
}

因為const修飾的是char,所以就是說:p所指向的記憶體地址所對應的值,是const,因此不可修改。但指標所指向的記憶體地址是可以修改的,因為其並不是const型別。

指標常量

:表示const修改的指標。

例如:

void testconst(char *const p) 
{ 
    char *tmp="13213"; 
    p=1;;//錯誤
    p=tmp;;//錯誤
    p[1]='a';//正確
    *(p+1)='a';//正確
} 

因為const修飾的是指標p,也就是說:指標所指向的記憶體地址是const,不可修改。但p所指向記憶體地址所對應的值是可以修改的,因為其並不是const型別。

指向常量的指標常量: const同時修飾型別和指標。只讀
例如:

void consttestconst(const char *const
p) { p=1;//錯誤 p[1]='a';//錯誤 }

因為const同時修飾這型別和指標,也就是說:指標所指向的記憶體地址不可修改同時記憶體地址所對應的值也不可修改。

總結:主要看的就是const所處的位置。

1)const 在*前:表示const修飾的為所申明的型別。常量指標

2)const 在*後:表示const修飾的為指標。指標常量

3)前*後均有:表示const同時修改型別和指標。指向常量的指標常量

const的優點

在C/C++中關鍵字const用來定義一個只讀的變數或者物件,有如下優點:

(1)便於型別檢查,如函式的函式 fun(const int a) a的值不允許變,這樣便於保護實參。
(2)功能類似與巨集定義,方便引數的修改和調整。如 const int max = 100;
(3)節省空間,如果再定義a = max,b=max。。。就不用在為max分配空間了,而用巨集定義的話就一直進行巨集替換併為變數分配空間
(4)為函式過載提供參考

常量指標和指標常量的區別

下面通過一個例子來解析 常量指標 和 指標常量,我們先總結一下 常量指標 和 指標常量 的區別

首先一定要明白哪種定義方式是常量指標,哪種是指標常量,這裡可以記住三句話加深記憶:

  • (指標)和 const(常量) 誰在前先讀誰 ;*象徵著地址,const象徵著內容;誰在前面誰就不允許改變。

好吧,讓我們來看這個例子:

int a =3;
int b = 1;
int c = 2;
int const *p1 = &b;//const 在前,定義為常量指標
int *const p2 = &c;//*在前,定義為指標常量 

常量指標p1:指向的地址可以變,但內容不可以重新賦值,內容的改變只能通過修改地址指向後變換。

p1 = &a是正確的,但 *p1 = a是錯誤的。

指標常量p2:指向的地址不可以重新賦值,但內容可以改變,必須初始化,地址跟隨一生。

p2= &a是錯誤的,而*p2 = a 是正確的。

關於常量指標,指標常量的知識點補充

1.概念:
常量指標是指–指向常量的指標,顧名思義,就是指標指向的是常量,即,它不能指向變數,它指向的內容不能被改變,不能通過指標來修改它指向的內容,但是指標自身不是常量,它自身的值可以改變,從而指向另一個常量。
指標常量是指–指標本身是常量。它指向的地址是不可改變的,但地址裡的內容可以通過指標改變。它指向的地址將伴其一生,直到生命週期結束。有一點需要注意的是,指標常量在定義時必須同時賦初值。
注:也有人將這兩個名稱的定義與含義反過來認為:“指標常量:顧名思義它的中心詞是“常量”這是重點,指標就是一個修飾的作用。所以這裡的指標還是一個變數,它的內容存放的是常量的地址。常量指標:關鍵字是指標,它是不能被改變的,因為指標總是指向地址的,所以它的意思是它指向的地址是不能被改變的”。但我個人認為後者不合理,所以使用前者。
2.使用方法:
使用時寫法上的區別:常量指標:const在之前 指標常量:const在之後。
當然我們也可以定義常量指標常量,那就需要加上兩個const,一前一後!以上只是從定義上給出兩者的本質上的不同,在具體使用上,還有很多變化,但萬變不離其宗,我們可以根據它的原理分析出各種複雜用法的實質。

3.使用技巧
使用指標常量可以增加程式碼的可靠性和執行效率。
如:

Int a;
Int * const p =&a;

增加可靠性:不用擔心p被修改或釋放導致非預期結果;
增加執行效率:不用在子函式中對p做為空檢查可以提高效率。

相關推薦

C語言——常量指標指標常量以及指向常量指標常量三者區別

C語言——常量指標和指標常量的區別 常量指標、指標常量以及指向常量的指標常量概念簡要描述 常量指標:表示const修飾的為所申明的型別。 例如: //注意char const *p與const char *p效果相同。 void consttest(co

大資料入門基礎系列之Hadoop1.XHadoop2.X和Hadoop3.X的多維度區別(博主推薦)

  不多說,直接上乾貨! 在前面的博文裡,我已經介紹了   見下面我寫的微信公眾號博文 歡迎大家,加入我的微信公眾號:大資料躺過的坑     免費給分享 同時,大家可以關注我的個人部

資訊學奧賽系列課程:C++語言數量型別變數和常量

C++語言基本資料型別:          在使用程式實現演算法的過程中,需要各種型別的資料,如:計算圓的半徑、周長、面積,描述 物體運動過程中的速度、時間、距離,購物時的數量、單價和總價等。      C++語言中,基本的資料型別有: 整型:int     包括正整數

C語言之變數常量(define\const)變數的宣告和定義

記憶體地址 #include<stdio.h> #include<stdlib.h> #include<Windows.h> void main(){ int num = 10; int num1 = 20; int num2

c語言記憶體管理指標malloc

C語言一共定義四個區塊:程式碼區、全域性變數和靜態變數區、棧、堆 針對四個區塊,使用者的記憶體分配也有三種不同的方式: 靜態變數區:在程式碼編譯的時候就分配好了,比如全域性變數,被static

c語言尋找指定字串的程式(程式利用指標完成封裝)

一定要注意註釋了*的位置  我除錯了好久才發現自己沒有分配內訓 指標定義完一定要記得三選一 1.去null了 2.分配記憶體 3.指向特定的位置 還有就是宕機基本本質上都跟錯誤的操作記憶體有關 還有就是關於字串的輸出問題 首先下面的是正確的但是可以發現這樣寫編譯器

Precision,Recall and F1-measure 準確率召回率以及綜合評價指標

通俗易懂,故轉一下。 轉自: http://www.cnblogs.com/bluepoint2009/archive/2012/09/18/precision-recall-f_measures.html   在資訊檢索和自然語言處理中經常會使用這些引數,下面簡單介紹如

指標一個錯誤以及static變數

首先說一下我的編譯環境與我的錯誤: 編譯環境:VS2008,編寫了一個MFC程式,在一個視窗內添加了Tab控制元件,控制元件內有兩個子視窗,一個用於控制另一個用於顯示。 程式Bug:我嘗試著這樣操作:控制視窗->呼叫主視窗的函式(主視窗例項化了兩個子視

c語言二維陣列的下標運算與指標偏移

首先,定義一個二維陣列int Array[y][x];     一、 對於二維陣列的指標偏移的運演算法則。同一維陣列一樣,二維陣列的陣列名也是指向第一個陣列元素的(即Array等於&Array[0][0]),且二維陣列的陣列元素在計算機內的記憶體存放也是連續的,

C-C++語言結構體中定義另一個結構體指標的經驗

本文進行討論的是,在Linux中,C/C++語言的結構體的使用情況。一般情況下,結構體的使用還是相對比較簡單的,它攜帶的一類物體的某一些屬性, 比如 struct person { int age; int height; //... }; 這個結

常量指標指標常量區別

在C/C++中關鍵字const用來定義一個只讀的變數或者物件,有如下優點     (1)便於型別檢查,如函式的函式 fun(const int a) a的值不允許變,這樣便於保護實參。     (2)

C語言 第 13節 陣列求和看 函式-陣列-指標 的關係

方法1:#include <stdio.h> #define SIZE 10 int sum(int *a, int n); int main() { long i; int arr

C語言:深複製VS淺複製 陣列VS指標

計算機是32位的,編譯器是dev-cpp。 C原始碼: #include <stdio.h> struct student{ char *name1; char name2[20]; }stu; int main() {

C語言中註釋識別符號以及關鍵字

一.註釋 註釋在各個語言中都非常重要,註釋由於解釋程式碼的含義,能提高程式的可讀性,註釋掉的內容不會參與編譯,註釋有的時候既能方便自己又能方便他人,很多時候我們自己寫的程式碼時間長了以後容易遺忘,這時候註釋就能幫助我們,註釋還能方便其他程式設計師閱讀程式碼。 註釋分為單行註

C語言:constkeyword結構體

data con post -s 標簽 初始化 weight 什麽 聯系 前幾節內容的解說,主要是內存地址及指針的分析。這一節解說一下easy混淆的keywordconstant及結構體的知識。 一、constkeyword 1. 字符常量的指針 char const

C語言的結構和聯合,以及PHP是怎麽實現弱類型的

main 中一 字符 變量類型 type 以及 logs void 例子   C語言的結構(struct):包含多個成員,可能有多種數據類型,並且需要分配幾種類型占用空間之和的空間。   聯合(union):支持多種類型,供使用者使用其中一種數據類型,當然是需要分配其中占用

c語言——運算符分支結構循環結構

amp stdio.h main 邏輯運算 運算符 || urn cnblogs tab 一、運算符 關系運算符 關系運算符含 義數學中的表示 < 小於 < <= 小於或等於 ≤ > 大於 > >= 大於或等於 ≥

C語言 左值右值

16px 不能 操作 b- 存在 text 記錄 右值 i++ 左值就是在賦值中可以放在賦值操作符兩邊的值 右值則是只可以放在賦值操作符右邊的值 ++i是直接給i變量加1,然後返回i本身,因為i是變量,所以可以被賦值,因此是左值表達式i++現產生一個臨時變量,記錄i的值,而

c語言清屏等待隨機函數

函數 font signed 說明 b- include 利用 意義 lee 清屏函數 #include<conio.h> system("CLS");或system(cls); 等待函數 #include<windows.h> Sleep

C語言第四講,typedef 關鍵字,以及作用域

pre 如果 訪問 作用域 c語言 pri 代碼 包含 結構         C語言第四講,typedef 關鍵字,以及作用域 一丶typedef關鍵字   在C語言中,有typedef 關鍵字,這個關鍵字的作用就是允許你為類型定義一個新的名字,也就是 起個別的名字 例如: