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