第一章 指針常識

和C語言中任何一個部分一樣,指針也有其基本的常識。本文不會介紹太多基礎(chǔ)的東西,關(guān)于指針的常識模塊也只是一帶而過,如有遺忘,請參考相關(guān)書籍。

1.1 變量

變量常常出現(xiàn)于表達(dá)式中,當(dāng)變量出現(xiàn)在表達(dá)式的左方時,它表示的是某個地址;而當(dāng)變量出現(xiàn)在表達(dá)式的右方時,它表示的是某個地址里存放的值。例如:

int a = 1; 
int b =2; a = b;

其中a = b;中的a表示的是a的地址空間,而b表示的是b的地址空間中的內(nèi)容。a = b則表示將a的地址空間的修改成b的地址空間中的內(nèi)容。簡而言之,對于變量來說,出現(xiàn)在賦值表達(dá)式的左邊則表示引用其地址,出現(xiàn)在賦值表達(dá)式的右邊則表示引用其值。整個表達(dá)式的意思就是,把某個地址里的內(nèi)容修改成后面的內(nèi)容。判斷一個賦值表達(dá)式是否合法就看賦值的左邊是否是個地址,而右邊又是否是個值。

1.2 指針初始化

定義一個指針只是向編譯器申請一個用于存放某個地址的地址空間,而且這個地址空間里的值應(yīng)該是某個地址,同時,指針本身也是一個變量。由于指針本身也是一個變量,那么它的默認(rèn)初值、作用域、生存周期等都符合變量的特性。

指針在使用時一定要先初始化:

例如,int *p; 則編譯器會分配一個4字節(jié)的內(nèi)存用于存放p,但是此時p還未初始化,它的值是不確定的。我們可以用&p取出此指針的地址,用p表示該地址中的內(nèi)容,但是,用*p引用該指針?biāo)赶虻淖兞康闹档慕Y(jié)果是不可預(yù)知的。如果運(yùn)氣好,會崩掉,如果運(yùn)氣不好,就等著程序給你添麻煩吧。

一般來說指針的使用流程是:

int *p = NULL;   //定義并附初值0
int a = 0; p = &a;  //使用前賦值
cout<<*p<<endl;  //指針引用
p = NULL;       //不用時清空

1.3 NULL系列

在C語言中諸如NULL之類的用于幫助程序員理解程序的宏定義\說明有很多,現(xiàn)簡要說明一下。

NUL:ASCII字符集中的’\0’字符的名字,它的字節(jié)模式為全0。事實上,根本就不存在預(yù)定義的符號NUL,如果想要使用,則必須自己定義。#define NUL 0 或 #define NUL '\0'
NULL:標(biāo)識空指針。定義為0 即 #define NULL 0
false:標(biāo)識邏輯0。定義為0 即 #define false 0
true:標(biāo)識邏輯1。定義為1 即#define false 1

1.4 指針常見錯誤

指針最常見的錯誤就是段錯誤了。程序在執(zhí)行時會分成許多段,對段的非法操作統(tǒng)稱為段錯誤。比如,修改只讀段的內(nèi)容,比如訪問不屬于該程序的段。最為常見的例子就是訪問不屬于該程序的地址空間。

一種好的編程風(fēng)格是在創(chuàng)建指針的時候賦初值NULL,因為一般而言任何操作系統(tǒng)都會把低位地址留給操作系統(tǒng),把高位地址留給應(yīng)用程序。當(dāng)應(yīng)用程序中引用地址0時會產(chǎn)生訪問不屬于該程序地址空間的操作,此時就會引發(fā)段錯誤。

對于某些要求對界的機(jī)器而言,當(dāng)某種類型的數(shù)據(jù)在內(nèi)存中的存儲地址處在錯誤的邊界上的時候,此時訪問這個地址會引發(fā)一個總線錯誤。

注:本文中各種特例都是在UNIX系統(tǒng)的gcc編譯器下調(diào)試的,本文所說的各種術(shù)語也都適用于UNIX系統(tǒng),但是對于Windows未必適用。

問題:段錯誤的精確定義是什么?段錯誤和可執(zhí)行程序的段到底有什么聯(lián)系?

1.5 指針常量

我們可以將一個常量強(qiáng)制轉(zhuǎn)換成指針,雖然這個操作并沒有太多的意義,但確實是可以的。例如:

int * a = (int*) 100; 
*(int*)100 = 100;

問題:用常量在程序中表示的地址是不是絕對地址?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型。 運(yùn)用指針編程是C語言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,620評論 3 44
  • 一、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡單分配策略的問題地址空間不隔離內(nèi)存使用效率低程序運(yùn)行的地址不確定 關(guān)于...
    SeanCST閱讀 8,144評論 0 27
  • C語言指針的總結(jié) 1. 變量 不同類型的變量在內(nèi)存中占據(jù)不同的字節(jié)空間。 內(nèi)存中存儲數(shù)據(jù)的最小基本單位是字節(jié),每一...
    xx_cc閱讀 4,127評論 11 39
  • void* 類型指針:通用變體類型指針;可以不經(jīng)轉(zhuǎn)換,賦給其他指針,函數(shù)指針除外;malloc返回的就是void*...
    冰吉凌閱讀 3,537評論 0 18
  • 我生活在農(nóng)村,一個家境不是很好的農(nóng)民家庭。 父親是個木匠,在農(nóng)活閑下來的冬天,會去周邊的四鄰八鄉(xiāng)的做點門窗家具之類...
    夏夜冬日閱讀 223評論 2 1

友情鏈接更多精彩內(nèi)容