關於C指標

2021-07-09 10:54:35 字數 2397 閱讀 3285

c語言中指標可以說是其精華,常有一句話,學會了指標你也就學會了

c語言。但是很多人不能理解指標。我寫這篇文章的目的是幫助大家理解指標,內容都是跟人的見解,沒有指標基礎的、c語言高手和不喜歡的就別看了。

大家都認為,

c語言之所以強大,以及其自由性,很大部分體現在其靈活的指標運用上。因此,說指標是

c語言的靈魂,一點都不為過。同時,這種說法也讓很多人產生誤解,似乎只有

c語言的指標才能算指標。

basic

不支援指標,在此不論。其實,

pascal

語言本身也是支援指標的。從最初的

pascal

發展至今的

objectpascal

,可以說在指標運用上,絲毫不會遜色於

c語言的指標。

首先我們來看看null的定義:

#ifdef __cplusplus

#define null    0

#else

#define null    ((void *)0)

#endif

null在c++中的定義就是0,在c中的定義是(void *)0,本質上還是0;指標的值說白了就是乙個數字,這個數字存在乙個變數中,這個變數就稱為指標。

那麼說隨便乙個數字都行嗎?肯定不是。這個數字是用來表示記憶體單元的,因此它必須是合法的記憶體位址,不管在什麼系統上它的值在ulong(unsigned long)範圍內,ulong在32位系統上是0-0xffffffff,在64位系統上就是0-0xffffffffffffffff;也就是說ulong根據執行環境改變。

以32位作業系統為例,在作業系統載入的時候要接管記憶體,那麼它怎麼管理呢?就是給每個記憶體單元編號,這個編號是乙個ulong型別的整數,所以它只能從0編號到0xffffffff,在普通pc上最小定址單元是byte(位元組),也就是最多可以編號0x100000000個位元組=4gb,這也就是為什麼大於4g記憶體的電腦都需要安裝64位作業系統的原因,32位作業系統最高支援4g記憶體,超出部分無法編號,作業系統也就不能管理,因此不能被使用。

注:以下以為32位系統

c語言中指標就是乙個編號,不管什麼型別的指標都是以個ulong型別的整數。那麼你不禁要問,為什麼我們在定義指標的時候還要指定型別?

舉個例子:

void increaseint(int *pi)

void increasechar(char *pc)

int main()

在函式increasint中我們使用了「*」運算子,*運算子就是我們從記憶體的位置取出值。假設變數a的位址是0x1000,傳到函式increasint中pi的值就是0x1000,我們使用「*」就可以從記憶體的0x1000處取往後4個位元組,加上256後放進0x1000-0x1003裡; 在函式

increaschar

中我們也使用了「*」運算子,假設b的位址是0xffc,傳到函式increaschar中pc的值就是0xffc,我們使用「*」就可以從記憶體的0xffc處取1個位元組,自增之後放進0xffc裡。

那麼編譯器怎麼知道「*」要取幾個位元組,這就是指標型別的作用了,指標型別就是告訴編譯器這個指標指向的目標占用的記憶體是多大,使用*和的時候才知道要取幾個位元組。

————————————————————————————割了————————————————————————————

最近專案太忙,把這個給忘了,七夕閒著沒事,給補上。

從上面的講述中大家應該可以明白,記憶體中儲存資料跟型別無關,它不考慮你是什麼型別,只有程式才去考慮型別;因為同樣一塊資料使用不同型別取出的值一樣,比如0xffffffff,使用unsigned int 取值是

4294967295,使用int取值是-1,使用unsigned char 取值是255(0xff),下面有個例子:

int main()

請問輸出的值是多少?

應該有相當一部分人認為會輸出0,

認為是10並且知道原因的請繞道,本文不適合你。不知道結果的繼續往下看,我先不說答案:

簡單劃一下函式的棧記憶體示意圖:

假設main函式基址為bp

引數空間(本例無參)

main函式基址 ----------------------------------------------- bp 

a的位址即&a為bp-4

b[1]的位址bp-8

b[0]的位址bp-12

假設int* p = b;那麼&b[0] = p, &b[1] = p + 1,以此類推b[2] = p + 2 ,那麼位元組偏移就是:p = &b[0] = bp - 12,那麼p + 2就是bp - 4,即a;驚奇的發現b[2]就是a,所以本例輸出的結果是10。能把這題看透徹,指標應該學的不會太差。

就寫這些了,不寫不知道,一寫發現真難,舉例子很難舉。 

關於C 指標

一.怎樣給多維陣列動態分配記憶體 allocate int p new int m for int i 0 i m i p i new int n use for int i 0 i m i for int j 0 j n j p i j i j free for int i 0 i m i del...

C 關於懸掛指標

如果乙個地方指標既不為空,也沒有被設定為指向乙個已知的物件,則這樣的指標稱為懸掛指標。在程式裡面是很危險的事 如下 include stdafx.h include iostream using namespace std typedef string t void f int p int main...

C 中關於this指標

在學習完c語言之後,很大的感覺就是指標是貫穿c語言的核心,但是接觸到c 後,發現很多都是封裝好的,直接用就可以。其中有一塊問題就是,通過函式去呼叫類的成員,上好像是直接訪問的,但是又有很多問題,為啥這個類裡面的函式可以直接訪問這個類裡面的成員呢?這就是我們需要關注的this指標。首先來看下面這段 c...