考点15 指向数组的指针变量《C语言程序设计》山东(春季高考)软件与应用技术类 知识点讲解
山东省(软件与应用技术类)春季高考
《C语言程序设计》复习讲义
模块 一 C 语言程序设计
考点 15 指向数组的指针变量
【考纲要求】
(1)掌握指向数组的指针变量。
【知识网络】
【知识和技能要点】
原创精品资源学科网独家享有版权,侵权必究
学科网(北京)股份有限公司
一、指向数组的指针变量
1. 定义与赋值
一维数组之元素,在内存中连续存放,故可借指针而遍历之。其法:先定义与数组同型之指针,如 int *p;,而后以数组首地址授之,如 p=a; 或 p=&a[0];,二者皆使 p 指首元素。定义之时,切不可误书为 int *p[5];,盖此乃指针数组,非指向数组之指针也。
(1)定义:int *p; 其型须与数组之元素同。
(2)赋值:p=a; 与 p=&a[0]; 皆使指首元素。
(3)误写:int *p[5]; 为指针数组,非此所指。
2. 数组名的含义
数组名者,非普通变量,乃地址常量也。其值为数组首元素之地址,故 a 与 &a[0] 同值。既为常量,故不可赋值,亦不可自增自减,如 a++ 非法,a=p 亦非法。然数组名可参与运算,如 a+i 即第 i 个元素之地址,此与指针之和略同。
(1)本义:数组名即首元素之地址,与 &a[0] 同值。
(2)常量之性:不可赋值,不可自增,a++ 与 a=p 皆非法。
(3)可运算:a+i 即第 i 个元素之地址。
3. 指针数组与之区别
指向数组之指针与指针数组,形近而实异。int *p; 者,一指针也,可指数组之元素;int *p[5]; 者,五元素之数组也,每元素皆一指针。前者一指针而可游走于数组,后者五指针而各指一处。分辨之法:视方括弧之所附,附于名者为数组,附于星号者为指向数组之指针。
(1)指向数组之指针:int *p; 一指针,可指元素。
(2)指针数组:int *p[5]; 五元素,各为一指针。
(3)辨法:方括弧附于名者为数组,否则为指针。
二、指针运算与元素访问
1. 指针的算术运算
指针之加减,非以字节计,而以元素计。若 p 指 a[0],则 p+1 指 a[1],p+i 指 a[i],与元素所占字节数无关。如 int 型元素占四字节,p+1 虽前进四字节,然所指者仍为下一元素。故 p+i 之意为“其后第 i 个元素”,非“其后第 i 个字节”。
(1)以元素计:p+1 指向下一元素,非下一字节。
原创精品资源学科网独家享有版权,侵权必究
学科网(北京)股份有限公司
(2)p+i:即第 i 个元素之地址,与 &a[i] 同。
(3)与他型无关:元素所占字节数不影响 p+1 之所指。
2. 四种等价写法
数组元素之访问,其写法有四而意则一:a[i]、*(a+i)、*(p+i)、p[i] 皆指同一元素。盖方括弧之用于指针,本即“取其址而复解引用”之简写,故 p[i] 与 *(p+i) 无异。明此四者之相通,则读他人之程序,不致为形所惑。
(1)四式:a[i]、*(a+i)、*(p+i)、p[i] 意皆相同。
(2)方括弧之实:p[i] 即 *(p+i) 之简写。
(3)意义:四者相通,读程序时不为形惑。
3. 以指针遍历数组
以指针遍历数组,其法有二:一为定指针之始末,如 for(p=a; p<a+5; p++) 而取 *p;二为以指针加下标,如 for(i=0;i<5;i++) 而取 *(p+i)。前者以指针自移,行文简练;后者以指针为基而复加下标,意更醒豁。二者所得无异,惟须留意其终,勿越其界。
(1)指针自移:for(p=a; p<a+5; p++) 取 *p。
(2)指针加下标:for(i=0;i<5;i++) 取 *(p+i)。
(3)注意:终值须恰在界内,勿越界。
三、指针作函数参数
1. 以数组名传参
以数组为函数之实参时,所传者非数组之全,乃其首地址也。故形参虽书为数组,实则受一地址;所传既为地址,则函数之内所改者,即主调函数之数组,此与普通变量之值传递大异。故欲于函数内改数组,此法最为直捷。
(1)所传者:数组名,即首元素之地址,非整个数组。
(2)形参之实:书为数组者,实受一地址。
(3)效果:函数内所改,即主调函数之数组。
2. 以指针形参接收
形参亦可径定为指针,如 void rev(int *p, int n);,其义与书为数组者同。调用之时,以数组名授之,如 rev(a, 5);。函数之内,或以 *(p+i) 取元素,或以 p[i] 取之,二者无异。又须别传长度,盖指针不知数组之大小,无以自定其界。
原创精品资源学科网独家享有版权,侵权必究
学科网(北京)股份有限公司