指標知識點總結

2021-10-12 20:59:21 字數 4379 閱讀 7430

指標及其應用

關於指標的考點(12—24分):

指標與指標變數的概念、指標與位址運算子。

變數、陣列、字串、函式、結構體的指標,以及指向變數、陣列、字串、函式、結構體的指標變數,通過指標引用以上各型別資料。

用指標作函式引數。

返回指標值的指標函式。

指標陣列、指向指標的指標。

main函式的命令列引數。

知識點歸納:

1.指標與指標變數的概念。

(1)指標:就是記憶體中的乙個儲存單元的位址,即記憶體單元的編號。

(2)指標變數:是乙個能存放位址值的變數。通過它存放的位址值能間接訪問它所指向的變數。

2.指標變數的定義。

型別名 *指標變數名

型別說明中可取c語言的有效型別,* 表示為指標型變數。如:

char *c1,*c2;

表示c1與c2是指標變數,其基型別是字元型。

注意:指標的基型別與其所指向的變數的型別要統一。

3.指標變數的使用方法

(1)使指標變數指向某個變數,(即將某變數的位址值賦給指標變數)例:

int x; int *p=&x; 或 int x,*p; p=&x;

(2)用間址運算(運算子為*)訪問所指變數,例:

*p=5;//用作左值時代表所指的變數

x=*p+9;//用作右值時代表所指變數的值

注意:指標變數在使用之前一定要指向某變數,而不能用常數直接賦值

4.指標運算的優先順序與結合性(主要涉及

單目運算子優先順序是相同的,但從右向左結合。

重點理解:

(1)*&a等同於a; &*p等同於&a。

(2)*p++等同於*(p++)

(3)*++p等同於*(++p)

(4)(*p)++與*(p++)的區別。(*p)++是變數值增值,相當於a++;而*(p++)則是用完當前值後,指標值增值,即相當於a, p++,是指向了新的位址。

5.指標與一維陣列(整型陣列)

(1)陣列的位址:即陣列中首個元素a[0]的位址。

(2)陣列位址的表示方法: (1)用陣列名a,(2)取首元素的位址,即&a[0]

(3)陣列指標:指向陣列的指標變數的簡稱,即指標變數中存放的是某陣列的首位址。例,

若有 int a[10],*p;p=&a;則可稱p為a陣列的指標,或稱p指向陣列a。

(4)指標與陣列的關係:通過移動指標使其指向不同的陣列元素

p,(p+1),(p+2),…,(p+9) 等同於 &a[0],&a[1],&a[2],…,&a[9]。

*p,*(p+1),*(p+2),…,*(p+9) 等同於a[0],a[1],a[2],…,a[9]。

(5)總結:一維陣列元素的合法引用方式

方式一,陣列名[下標], 例如 a[0],a[1],…

方式二,指標名[下標],例如 p[0],p[1],…

方式三,*(指標名+下標),例如 *p,*(p+0),*(p+1),…

方式四,*(陣列名+下標),例如 *a,*(a+0),*(a+1),…

(在c中,陣列名就是第乙個元素的位址,因此對陣列的引用可以直接用*a表示a[0],用*(a+1)表示a[1],用*(a+2)表示a[2],…,用*(a+9)表示a[9]。)

6. 陣列名或陣列指標作函式引數

屬於陣列、指標、函式的綜合應用,注意函式呼叫時傳值和傳址的區別:

(1)形參為普通變數時是傳值呼叫

(2)形參為指標變數時是傳址呼叫

例1:傳值呼叫(形參為普通變數,呼叫後形參不會影響實參)

#include

void fun(int a,int b)

void main()

例2:傳址呼叫(形參為指標,呼叫後形參值影響實參)

#include

void fun(int *a,int *b)

void main()

例3 傳址呼叫(形參為指標,可利用此類形參返回多個結果)

#include

void fun(int a,int b, int *c,int* d)

void main()

例4 傳址呼叫(形參為陣列名)

#include

void fun(int b,int i)

void main()

, i;

fun(a,5);

for (i=0;i<10;i++) printf("%d",a[i]);

}7.指標與一維陣列(字元陣列)

用指標方式與用字元陣列方式操作字串的區別:

(1)儲存方式不同。字元陣列由若干個元素組成,每個元素中放乙個字元,而字元指標變數中存放的是位址(字串首個字元的位址),決不是將字串放到字元指標變數中。

(2)賦值方式不同。

對字元陣列只能對各個元素賦值,不能用以下辦法對字元陣列賦值。

char str[20];

str="good luck!";

而對字元指標變數,可以採用下面方法賦值:

char *str;

str="good luck!";

賦給str的不是字元,而是字串第乙個元素的位址。

(3)輸入方式不同。

對字元陣列可用如下方式賦值:

char str[20];

scanf("%s",str); //ok

但對字元指標變數則不建議用此方式,因為會發生指標的異常指向,正確做法為:

char *str,a[20];

str=a; //使指標有明確的指向

scanf("%s",str);

(4)字元指標變數的值是可以改變的,而字元陣列名的值是不可以改變的。

例1:#include

void main()

例2:#include

void main()

8. 指標與二維陣列(整型、字元型)

(1)二維陣列的按行儲存

若有 int a[2][3]=,},*p=a; 則*(p+4)=a[1][1]=5

(2)二維陣列元素的位址表示及訪問方式

設int a[2][3],*p;p=&a;

可見a是2×3的陣列,含有6 個元素。可認為a有兩個元素:a[0]和a[1];而a[0]與a[1]又分別是具有三個元素的一維陣列。

a a[0]所含元素為: a[0][0],a[0][1],a[0][2];

a[1]所含元素為: a[1][0],a[1][1],a[1][2]

(可以記憶為:二維陣列a含有二個行元素,每個行元素又含有3個列元素)

因此對於二維陣列a,a[0]即&a[0][0],也就是第0行的首位址。a[1]就是&a[1][0],也就是第一行的首位址。

由位址運算規則,a[0]+0就是&a[0][0],a[0]+1就是&a[0][1],a[0]+2就是&a[0][2]。所以一般地:a[i]+j=&a[i][j].

在二維陣列中,可以用指標表示陣列元素的位址,如:a[i]+j=&a[i][j]也可寫為*(a+i)+j=&a[i][j],從而可知,*(*(a+i)+j)就是a[i][j],即a[i][j]= *(*(a+i)+j)。

8.函式與指標

(1)指標作為函式引數(知識點6)

(2)函式的返回值為指標型別

定義方式為:型別 *函式名( );

例:#include

int z;

int *fun(int x,int y)

void main()

(3)指向函式的指標變數

定義方式為: 型別 (*變數名)();

這裡變數名前乙個*號,說明該變數是指標變數,而後面有括號說明這個指標變數是指向函式的。如:int (*p1)( ); 說明p1是指標變數,這個指標變數是指向函式的。

9.指標陣列與指向一維陣列的指標變數

(1)指標陣列:乙個陣列,它的元素都為指標型別。

定義方式為:型別說明 *陣列名[整型常量表示式]

如:char *s[4];則定義了乙個指標陣列,即s[0],s[1],s[2],s[3]均用來存放位址值,主要用於處理多個字串。

(2)指向一維陣列的指標:乙個指標,指向乙個一維陣列

定義形式是:型別說明 (*變數)[整型常量表示式]

如:int (*p)[4];定義p為指標變數,它指向的是乙個具有四個元素的一維陣列。

10.指向指標的指標

指向指標的指標也就是「二級指標」。

定義方式如下:型別說明 **指標變數名

即定義乙個二級指標變數,型別說明是它指向的指標變數所指向的變數的資料型別。它所指向的指標變數稱為一級指標變數。

賦值形式為:二級指標變數=&一級指標變數;

這類似於張三有李四的位址,而王五有張三的位址,這樣王五通過張三找到李四。這樣張三是一級指標,而王五是二級指標。

例如:#include

void main()

{char *name[]=;

陣列及指標知識點總結

第9章陣列 第1課知識點一 定義一維陣列 格式 型別名陣列名 元素個數 例1 定義乙個包含4個整數的陣列a int a 4 例2 定義乙個包含3個雙精度數的陣列b double b 3 注意 c語言中陣列的下界從0開始計數。例如 a 4 的4個元素分別為a 0 a 1 a 2 a 3 知識點二 一維...

指標概念知識點總結 經典

變數的位址就是變數的指標。變數的值和變數的位址是不同的概念,變數的值是該變數在記憶體單元中的資料。用來存放指標 位址 的變數就稱為指標變數。若把某變數的位址賦值給指標變數p,則稱指標變數p指向該變數。定義指標變數的一般形式為 型別名 指標變數名 其中 為說明符,而不是運算子。通常指標變數可以通過以下...

知識點總結

網路綜合 初中二年級 八年級數學 上 應知應會的知識點 因式分解 1.因式分解 把乙個多項式化為幾個整式的積的形式,叫做把這個多項式因式分解 注意 因式分解與乘法是相反的兩個轉化.2 因式分解的方法 常用 提取公因式法 公式法 分組分解法 十字相乘法 3 公因式的確定 係數的最大公約數?相同因式的最...