指標與陣列

2021-09-26 15:09:21 字數 3029 閱讀 3654

2 指標與函式引數

3 指標與陣列

4 位址算術運算

5 字元指標與函式

6 指標陣列及指向指標的指標

7 多維陣列

8 指向函式的指標

9 複雜宣告

指標是一種儲存變數位址的變數。

1.1 記憶體組織

通常的機器都有一系列連續編號或編址的儲存單元,這些儲存單元可以單個進行操縱,也可以以連續成組的方式操縱。通常情況下,機器的乙個位元組為8位。指標是能夠存放乙個位址的一組儲存單元(通常為4位元組)。

1.2 運算子

一元運算子&可用於取乙個物件的位址。p = &c;把c的位址賦值給變數p,成p為指向c的指標。&只能用於記憶體中的物件(變數和陣列元素),不能用於表示式、常量或暫存器變數。

一元運算子*是簡介定址或間接引用運算子。當它作用於指標時,將訪問指標所指向的物件。

1.3 指標宣告

指標只能指向某種特定型別的物件,即每個指標都必須指向一種特定的資料型別。

資料型別 *指標名

c語言以傳值方式將引數值傳遞給被呼叫函式,因此被呼叫函式不能直接修改主調函式中變數的值。

指標引數使得被呼叫函式能夠訪問和修改主調函式中物件的值。

通過陣列下標所能完成的任何操作都可以通過指標來實現。用指標編寫的程式比用陣列下標編寫的程式執行速度快。

3.1 陣列宣告

int a[10];定義了乙個長度為10的陣列a,即由10個物件組成的集合,這10個物件儲存在相鄰的記憶體區域中。int *pa; pa = &a[0];表示指標pa指向陣列a的第0個元素。pa+1;表示指向pa所指向的物件的下乙個物件。pa = a;陣列名代表的就是該陣列最開始的乙個元素的位址。pa[i]等價於*(pa+i)。陣列名不是變數,故給陣列名賦值的語句是非法的。

在函式定義中,形式引數char schar *s是等價的。

指標可以初始化,通常對指標有意義的初始化只能是0(null)或者是表示位址的表示式,此位址必須是在此前已定義的具有適當型別的資料的位址。

指標與指標之間不能互相轉換,但0是唯一的例外,常量0可以賦值給指標,指標也可以和常量0進行比較。常用符號常量null代替常量0。

某些情況下可以對指標進行比較運算,例如兩個指標指向同乙個陣列的成員,則它們之間可以進行==、!=、<、>=等關係比較運算。

指標可以和整數進行相加或相減運算。

字串常量是乙個字元陣列,如:「i am a string」,字串常量以空字元 『\0』 結尾。字串常量可以通過乙個指向其第乙個元素的指標訪問。

//將字元陣列的指標賦值給ps,並未進行字串的複製

char

*ps;

ps =

"it is a string"

;/* 定義乙個陣列 */

char a=

"now is the time"

;/* 定義乙個指標 */

char

*pa =

"now is the time"

;

strcat函式:

void

strcat

(char

*s,char

*t)

strcpy函式:

若使用語句s=t實現,其實質上只是拷貝了指標,並沒有複製字元。

/* 將指標t指向的字串複製到指標s指向的位置 */

void

strcpy

(char

*s,char

*t)//表示式同'\0'比較是多餘的,if(*s++ = *t++)與if((*s++ = *t++) != '\0')是等價的

strcmp函式:

/* 根據s按照字典順序小於、等於或大於t的結果分別返回負整數、0或正整數 */

intstrcmp

(char

*s,char

*t)

二維陣列是一種特殊的一維陣列,它的每個元素也是乙個一維陣列。若將二維陣列作為引數傳遞給函式,則在函式的引數宣告中必須指明陣列的列數。因為函式呼叫時傳遞的是乙個指標,它指向由行向量構成的一維陣列。

int a[2]

[13];

int a[

13];//指向具有13個整型元素的陣列的指標,陣列指標

int(

*a)[13]

;//該陣列有13個指向整型的指標元素,指標陣列

int*a[13]

;

指標陣列的初始化

7.1 指標與多維陣列

int a[10]

[20];

int*b[10]

;

a是真正的二維陣列,它分配了200個int型別長度的儲存空間,並且通過矩陣下標計算公式20*row+col(row表示行,col表示列)計算得到a[row][col]的位置。而b只是分配了10個指標,並且沒有對她們初始化,優點在於陣列每一行長度可以不同。

在c語言中,函式本身不是變數,但可以定義指向函式的指標。

//指向無返回值,有乙個int引數的函式的指標,函式指標

void

(*fun)

(int);

//返回無型別指標的函式,指標函式

void

*fun

(int

);

在c語言中,函式本身不是變數,但可以定義指向函式的指標。

//指向無返回值,有乙個int引數的函式的指標,函式指標

void

(*fun)

(int);

//返回無型別指標的函式,指標函式

void

*fun

(int

);

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

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元素的陣列。其實這兩種寫法主要是因為運算子的優先...