?? tc11.dat
字號(hào):
指向數(shù)組的指針變量的定義,與指向普通變量的指針變量的定義方法一樣.
例如,int array[10], *pointer=array(或&array[0]);
或者:
int array[10], *pointer;
pointer=array;
注意:數(shù)組名代表數(shù)組在內(nèi)存中的起始地址(與第1個(gè)元素的地址相同),所以可以用數(shù)組名給指針變量賦值.
3.數(shù)組元素的引用
數(shù)組元素的引用,既可用下標(biāo)法,也可用指針法.使用下標(biāo)法,直觀;而使用指針法,能使目標(biāo)程序占用內(nèi)存少、運(yùn)行速度快.
9.3.2 通過指針引用數(shù)組元素
如果有“int array[10],*pointer=array;” ,則:
(1)pointer+i和array+i都是數(shù)組元素array[i]的地址,如圖9-6所示.
(2)*(pointer+i)和*(array+i)就是數(shù)組元素array[i].
(3)指向數(shù)組的指針變量,也可將其看作是數(shù)組名,因而可按下標(biāo)法來使用.例如,pointer[i]等價(jià)于*(pointer+i).
注意:pointer+1指向數(shù)組的下一個(gè)元素,而不是簡單地使指針變量pointer的值+1.其實(shí)際變化為pointer+1*size(size為一個(gè)元素占用的字節(jié)數(shù)).
例如,假設(shè)指針變量pointer的當(dāng)前值為3000,則pointer+1為3000+1*2=3002,而不是3001.
[案例9.5] 使用指向數(shù)組的指針變量來引用數(shù)組元素.
/*案例代碼文件名:AL9_5.C*/
/*程序功能:使用指向數(shù)組的指針變量來引用數(shù)組元素*/
main()
{ int array[10], *pointer=array, i;
printf(“Input 10 numbers: ”);
for(i=0; i<10; i++)
scanf(“%d”, pointer+i); /*使用指針變量來輸入數(shù)組元素的值*/
printf(“array[10]: ”);
for(i=0; i<10; i++)
printf(“%d ”, *(pointer+i)); /*使用指向數(shù)組的指針變量輸出數(shù)組*/
printf(“\n”);
} [程序演示]
程序運(yùn)行情況:
Input 10 numbers: 0 1 2 3 4 5 6 7 8 9←┘
array[10]: 0 1 2 3 4 5 6 7 8 9
程序說明:
程序中第3行和第6行的2個(gè)for語句,等價(jià)于下面的程序段:
for(i=0; i<10; i++,pointer++)
scanf(“%d”,pointer);
printf(“array[10]: ”);
pointer=array; /*使pointer重新指向數(shù)組的第一個(gè)元素*/
for(i=0; i<10; i++,pointer++)
printf(“%d”,*pointer);
思考題:
(1)如果去掉“pointer=array;”行,程序運(yùn)行結(jié)果會(huì)如何?請(qǐng)上機(jī)驗(yàn)證.
(2)在本案例中,也可以不使用i來作循環(huán)控制變量,程序怎么修改?提示:指針可以參與關(guān)系運(yùn)算.
說明:
(1)指針變量的值是可以改變的,所以必須注意其當(dāng)前值,否則容易出錯(cuò).
(2)指向數(shù)組的指針變量,可以指向數(shù)組以后的內(nèi)存單元,雖然沒有實(shí)際意義.
(3)對(duì)指向數(shù)組的指針變量(px和py)進(jìn)行算術(shù)運(yùn)算和關(guān)系運(yùn)算的含義
1)可以進(jìn)行的算術(shù)運(yùn)算,只有以下幾種:
px±n, px++/++px, px--/--px, px-py
·px±n:將指針從當(dāng)前位置向前(+n)或回退(-n)n個(gè)數(shù)據(jù)單位,而不是n個(gè)字節(jié).顯然,px++/++px和px--/--px是px±n的特例(n=1).
·px-py:兩指針之間的數(shù)據(jù)個(gè)數(shù),而不是指針的地址之差.
2)關(guān)系運(yùn)算
表示兩個(gè)指針?biāo)傅刂分g、位置的前后關(guān)系:前者為小,后者為大.
例如,如果指針px所指地址在指針py所指地址之前,則px〈py的值為1.
9.3.3 再論數(shù)組作函數(shù)參數(shù)
數(shù)組名作形參時(shí),接收實(shí)參數(shù)組的起始地址;作實(shí)參時(shí),將數(shù)組的起始地址傳遞給形參數(shù)組.
引入指向數(shù)組的指針變量后,數(shù)組及指向數(shù)組的指針變量作函數(shù)參數(shù)時(shí),可有4種等價(jià)形式(本質(zhì)上是一種,即指針數(shù)據(jù)作函數(shù)參數(shù)):
(1)形參、實(shí)參都用數(shù)組名
(2)形參、實(shí)參都用指針變量
(3)形參用指針變量、實(shí)參用數(shù)組名
(4)形參用數(shù)組名、實(shí)參用指針變量
9.3.4 2維數(shù)組的指針及其指針變量
1. 2維數(shù)組的指針
假設(shè)有如下數(shù)組定義語句: int array[3][4];
(1)從2維數(shù)組角度看,數(shù)組名array代表數(shù)組的起始地址, 是一個(gè)以行為單位進(jìn)行控制的行指針:
·array+i:行指針值,指向2維數(shù)組的第i行.
·*(array+i):(列)指針值,指向第i行第0列(控制由行轉(zhuǎn)為列,但仍為指針).
·*(*(array+i)):數(shù)組元素array[i][0]的值.
用array作指針訪問數(shù)組元素array[i][j]的格式:
*(*(array+i)+j)
注意:行指針是一個(gè)2級(jí)指針,如圖9-7所示.
(2)從1維數(shù)組角度看,數(shù)組名array和第1維下標(biāo)的每一個(gè)值, 共同構(gòu)成一組新的1維數(shù)組名array[0]、array[1]、array[2],它們均由4個(gè)元素組成.
C語言規(guī)定:數(shù)組名代表數(shù)組的地址,所以array[i]是第i行1維數(shù)組的地址, 它指向該行的第0列元素,是一個(gè)以數(shù)組元素為單位進(jìn)行控制的列指針:
·array[i]+j:(列)指針值,指向數(shù)組元素array[i][j].
·*(array[i]+j):數(shù)組元素array[i][j]的值.
如果有“int array[3][4],*p=array[0];”,則p+1指向下一個(gè)元素,如圖9-8所示.
用p作指針訪問數(shù)組元素array[i][j]的格式:
*(p+(i*每行列數(shù)+j) )
2.行指針變量──指向由n個(gè)元素組成的一維數(shù)組的指針變量
(1)定義格式
數(shù)據(jù)類型 (*指針變量)[n];
注意:“*指針變量”外的括號(hào)不能缺,否則成了指針數(shù)組--數(shù)組的每個(gè)元素都是一個(gè)指針──指針數(shù)組(本章第6節(jié)介紹).
(2)賦值
行指針變量 = 2維數(shù)組名 | 行指針變量;
[案例9.6] 使用行指針和列指針兩種方式輸出2維數(shù)組的任一元素.
(1) 使用行指針
/*案例代碼文件名:AL9_6_1.C*/
/*程序功能:使用行指針輸出2維數(shù)組的任一元素*/
main()
{ int array[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int (*pointer)[4], row, col;
pointer=array;
printf(“Input row = ”); scanf(“%d”, &row);
printf(“Input col = ”); scanf(“%d”, &col);
printf(“array[%1d][%1d] = %d\n”, row, col, *(*(pointer+row)+col));
} [程序演示]
程序運(yùn)行情況:
Input row = 1←┘
Input col = 2←┘
array[1][2] = 7
思考題:本題也可以直接使用數(shù)組名array作指針,應(yīng)如何修改?
(2)使用列指針
/*案例代碼文件名:AL9_6_2.C*/
/*程序功能:使用列指針輸出2維數(shù)組的任一元素*/
main()
{ int array[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int *pointer, row, col; /*定義一個(gè)(列)指針變量pointer*/
pointer=array[0]; /*給(列)指針變量pointer賦值*/
printf(“Input row = ”); scanf(“%d”,&row);
printf(“Input col = ”); scanf(“%d”,&col);
printf(“array[%1d][%1d] = %d\n”, row, col, *(pointer+(row*4+col)));
} [程序演示]
3. 2維數(shù)組指針作函數(shù)參數(shù)
2維數(shù)組的指針作函數(shù)實(shí)參時(shí),有列指針和行指針兩種形式.相應(yīng)的,用來接受實(shí)參數(shù)組指針的形參,必須使用相應(yīng)形式的指針變量,如下所示:
實(shí)參: 列指針 行指針
↓ ↓
形參: (列)指針變量 行指針變量
9.3.5 動(dòng)態(tài)數(shù)組的實(shí)現(xiàn)
在程序運(yùn)行過程中,數(shù)組的大小是不能改變的.這種數(shù)組稱為靜態(tài)數(shù)組.靜態(tài)數(shù)組的缺點(diǎn)是:對(duì)于事先無法準(zhǔn)確估計(jì)數(shù)據(jù)量的情況,無法做到既滿足處理需要,又不浪費(fèi)內(nèi)存空間.
所謂動(dòng)態(tài)數(shù)組是指,在程序運(yùn)行過程中,根據(jù)實(shí)際需要指定數(shù)組的大小.
在C語言中,可利用內(nèi)存的申請(qǐng)和釋放庫函數(shù),以及指向數(shù)組的指針變量可當(dāng)數(shù)組名使用的特點(diǎn),來實(shí)現(xiàn)動(dòng)態(tài)數(shù)組.
動(dòng)態(tài)數(shù)組的本質(zhì)是:一個(gè)指向數(shù)組的指針變量.
[案例9.7] 動(dòng)態(tài)數(shù)組的實(shí)現(xiàn).
/*案例代碼文件名:AL9_7.C*/
/*程序功能:實(shí)現(xiàn)動(dòng)態(tài)數(shù)組*/
#include “alloc.h”
#include “stdlib.h”
main()
{ int *array=NULL, num, i;
printf(“Input the number of element: ”); scanf(“%d”, &num);
/*申請(qǐng)動(dòng)態(tài)數(shù)組使用的內(nèi)存塊*/
array=(int *)malloc( sizeof(int) * num );
if ( array==NULL ) /*內(nèi)存申請(qǐng)失敗:提示,退出*/
{ printf(“out of memory, press any key to quit……”);
exit(0); /*exit():終止程序運(yùn)行,返回操作系統(tǒng)*/
}
/*提示輸入num個(gè)數(shù)據(jù)*/
printf(“Input %d elements: ”, num);
for (i=0; i<num; i++) scanf(“%d”, &array[i]);
/*輸出剛輸入的num個(gè)數(shù)據(jù)*/
printf(“%d elements are: ”, num);
for (i=0; i<num; i++) printf(“%d,”, array[i]);
printf(“\b ”); /*刪除最后一個(gè)數(shù)據(jù)后的分隔符“,”*/
free(array); /*釋放由malloc()函數(shù)申請(qǐng)的內(nèi)存塊*/
} [程序演示]
程序運(yùn)行情況:
Input the number of element: 3←┘
Input 3 elements: 1 2 3←┘
3 elements are: 1,2,3
程序說明:
(1) array=(int *)malloc( sizeof(int) * num );語句──malloc()函數(shù)和sizeof運(yùn)算符
1)庫函數(shù)malloc()
·用法:void *malloc(unsigned size)
·功能:在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)分配1個(gè)長度為size的連續(xù)空間.
·返回值:申請(qǐng)成功,則返回新分配內(nèi)存塊的起始地址;否則,返回NULL.
·函數(shù)原型:alloc.h,stdlib.h.
malloc()函數(shù)的返回值是一個(gè)無類型指針,其特點(diǎn)是可以指向任何類型的數(shù)據(jù).但在實(shí)際使用malloc()函數(shù)時(shí),必須將其返回值強(qiáng)制轉(zhuǎn)換成被賦值指針變量的數(shù)據(jù)類型,以免出錯(cuò).
2)運(yùn)算符sizeof
·格式:sizeof(變量名/類型名)
·功能:求變量/類型占用的內(nèi)存字節(jié)數(shù)(正整數(shù)).例如,在IBM-PC機(jī)上,sizeof(int)=2.
思考題:在該語句中,使用sizeof(int)求出1個(gè)int型數(shù)據(jù)占用的內(nèi)存字節(jié)數(shù),而不是使用常量“2”,為什么?
(2) scanf(“%d”, &array[i]);語句和printf(“%d,”, array[i]);語句
將指向數(shù)組的指針變量當(dāng)作數(shù)組名使用,所以就必須按引用數(shù)組元素的語法規(guī)則來使用.
(3) printf(“\b ”);語句
“\b” 在該語句中的作用是,使光標(biāo)定位到最后一個(gè)數(shù)據(jù)后的分隔符“,”上,然后再輸出一個(gè)空格,以達(dá)到刪除之目的.
(4) free(array);語句──庫函數(shù)free()
·用法:void free(void *ptr)
·功能:釋放由ptr指向的內(nèi)存塊(ptr是調(diào)用malloc() 函數(shù)的返回值).
·返回值:無.
·函數(shù)原型:stdlib.h,alloc.h.
原則上,使用malloc()函數(shù)申請(qǐng)的內(nèi)存塊,操作結(jié)束后,應(yīng)及時(shí)使用free()函數(shù)予以釋放.尤其是循環(huán)使用malloc()函數(shù)時(shí),如果不及時(shí)釋放不再使用的內(nèi)存塊,很可能很快就耗盡系統(tǒng)的內(nèi)存資源,從而導(dǎo)致程序無法繼續(xù)運(yùn)行.
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -