陣列與指標

2021-07-03 23:50:53 字數 2713 閱讀 3486

「宣告」與「定義」最大的區別在於「定義」建立了乙個物件並且為它分配了記憶體空間,而「宣告」並沒有為它分配記憶體空間。

下圖描述了記憶體空間中的一些相關概念。

棧:這是儲存器用來儲存區域性變數的部分。每當呼叫函式,函式的所有區域性變數都在棧上建立。該記憶體空間由編譯器自動分配釋放。其操作方式類似於資料結構中的棧。

堆:堆用於動態儲存。程式在執行時建立的一些資料會儲存在堆中。該記憶體空間由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由作業系統**。其操作方式類似於資料結構中的鍊錶,與資料結構中的堆要區分開。

全域性量:又可以稱作「靜態區」。主要儲存全域性變數和區域性靜態變數。全域性量位於函式之外,在程式開始執行時建立,對所有函式可見。程式結束後該記憶體空間由系統釋放。

常量段:常量是在程式中要用到的不變數,也是在程式開始執行時建立。程式結束後由系統釋放。

**段:儲存器中用來載入機器**的部分。

在上述5個區域中,常量段與**段都是唯讀的。

宣告char names在不同的地方出現具有不同的意義。如果是普通的變數宣告,names就是乙個陣列,而且必須馬上賦值,比如

int function()
但是如果names以函式引數的形式宣告,那麼names其實就是指標,它不過是*names的語法糖。

void function(char names)

void function(char *names)

// 上面兩種形式是等價的

先看下面兩段**:

#include 

int main()

#include 

int main()

第二段**可以正常地編譯執行,但是根據執行環境的不同,第一段**編譯執行時會得到各種不同的錯誤。簡單的看,問題的原因是「字串無法更新」。

在第一段**中,計算機儲存器是這樣運作的:

1. 計算機載入字串字面值

當計算機把程式載入到儲存器時,會把所有常量值(如字串常量jqk)放到常量儲存區,這部分儲存器是唯讀的。

2. 程式在棧上建立cards變數

cards是區域性變數,被儲存到棧中。

3.cards變數指向」jqk「的位址

4. 計算機試圖修改字串

計算機試圖修改cards變數指向的字串時會失敗,因為字串所在的常量區是唯讀的。

具體流程如下圖示:

在第二段**中,計算機儲存器是這樣運作的:

1. 計算機載入字串字面值

當計算機把程式載入到儲存器時,會把所有常量值(如字串常量jqk)放到常量儲存區,這部分儲存器是唯讀的。

2. 程式在棧上新建乙個陣列

由於宣告了陣列,程式會在棧上開闢一塊記憶體空間給陣列。

3. 程式初始化陣列

程式將字串字面值」jqk「內容複製到棧上。

4. 計算機修改字串

程式對棧中的字串副本進行修改,達到目的。

具體流程如下圖示:

為了規避上述問題,在把指標設定為字串字面值的時候,需要使用關鍵字constconst char *s = "abc",這樣一來,如果編譯器發現有**試圖修改字串,就會提示編譯錯誤。需要注意的是,加不加關鍵字const,字串字面值都是唯讀的,const只是敲醒了編輯器。

對於char s = "abcd"char *t = "abcd"

sizeof()函式會有不同,sizeof(s) == 5為陣列在儲存器中的長度而sizeof(t)的大小等於該環境下char的長度。

對於取址符號&&s返回的是陣列,即陣列s的位址就是陣列本身&t則表示char型變數t的位址。

當建立指標變數時,計算機會為它分配一定大小的記憶體空間。但如果建立的是乙個陣列,計算機會為陣列分配記憶體空間,但不會為陣列變數分配任何空間,編譯器僅在它出現的地方把它替換為陣列的起始位址。

指標與陣列,指標陣列 陣列指標

int a 10 print n a p,a p a,a print n a 1 p,a 1 p a 1,a 1 a做乙個指標,步長為4,指向乙個元素,a做乙個指標,步長為40,指向乙個維陣列 int b 3 4 print n b p,b p,b p b,b,b print n b 1 p,b 1...

指標陣列與陣列指標

1.指標陣列 指標陣列中每乙個元素都是乙個指標,也既是存放字串的首位址。所以指標陣列適合處理若干個長度不等的字串。定義的一般形式為 型別說明符 指標陣列名 陣列長度 例如 int p 3 宣告乙個陣列,指標陣列p,由3個int型別指標變數元素組成 從運算子的優先順序分析,由於 的優先順序大於 所以p...

指標陣列與陣列指標

呵呵,實在是厭倦了繞口的解釋。指標陣列,故名思義,就是指標的陣列,陣列的元素是指標 陣列指標,同樣,就是直想陣列的指標。簡單舉例說明 int p 2 首先宣告了乙個陣列,陣列的元素是int型的指標。int p 2 宣告了乙個指標,指向了乙個有兩個int元素的陣列。其實這兩種寫法主要是因為運算子的優先...