当前位置:首页 >> 学科竞赛 >>

第十一讲 指 针(二


四、二维数组的指针 1.二维数组的指针概念
在C语言中,一个二维数组可以看成是一 个一维数组,其中每个元素又是一个包含若干 元素的一维数组。
假如有定义:int a[2][3]; 则C语言编译程序认为a数组是由a[0],a[1] 两个元素组成的一维数组,a[0]和a[1]分别是 包含三个元素的一维数组名,分别代表a数组元 素的起始地址(即a[0]是第0行元素

的首地址, a[1]是第1行元素的首地址)。因此,a和a[0] 是两个基类型不同的指针常量。

2.通过指针引用二维数组元素
假如有定义: int a[3][5], i,j ; (其中0≤i <3, 0≤j <5) 则:⑴a[i]和*(a+i)(无条件等价)都是第i行第0列 元素的地址,那么a[i]+j、*(a+i)+j、 &a[0][0]+5*i+j都是第i行第j列元素的地址。

⑵数组a中任意元素a[i][j]的引用可以表示成如 下几种形式: a[i][j]、*(a[i]+j)、*(*(a+i)+j)、(*(a+i))[j]、 *(&a[0][0]+5*i+j )

3.通过一个行指针变量引用二维数组的元素
定义一个由m个元素组成的一维数组的 指针变量的一般形式: 类型标识符 (*指针变量名)[m]; 注意:*p两侧的圆括号不可缺少。 例如:假若有语句 int a[2][3], (*p)[3]; p=a; 则:⑴ p是一个指向由3个整型元素组成的一 维 数 组的指针变量。 ⑵ p指向a数组,p+1指向数组a的下一行首地 元 址,a和p的基类型相同,则a数组中任意

素a[i][j]还可以如下表示: *(p[i]+j) 、*(*(p+i)+j) 、(*(p+i))[j] 、p[i][j]

例:使用行指针变量访问数组元素。
main() { float fa[5][10], (*pf)[10]=fa;

int i,j;
for(i=0; i<5; i++) for(j=0; j<10; j++) *(*(pf+i)+j)=i*j; for(i=0;i<5;i++) for(puts(""),j=0;j<10;j++)

printf(" %.0f",fa[i][j]);
}

字符串指针:字符串的首地址。

字符指针变量:指向字符串的指针变量。
字符指针变量定义的一般形式: char *指针变量名; 字符指针变量定义时可以赋初值。 例如:char *strp=“Hello!”; 定义了一个指向字符串的指针变量,并将字符 串的首地址赋值给strp指针变量,即:使指针变 量strp指向字符串首地址。

C程序访问字符串有以下两种方法: 1. 用字符数组存放一个字符串

例如:char s []="I am a student."; 字符串输出语句可写成:
⑴ printf(“%s\n”,s); 也可用s[i]!=?\0? ⑵ for(i=0; s[i]; i++)printf(“%c”, s[i]); ⑶ for(i=0; s[i]; i++)printf(“%c”,*(s+i));

2.用字符指针指向一个字符串 例如:char *ps="I am a student.";

字符串输出语句可写成:
⑴ printf(“%s\n”,s); ⑵ for(; *ps; ps++)printf(“%c”, *ps);

说明:
⑴字符数组由若干个元素组成,每个元素中放一个 字符。而字符指针变量中存放的是地址(字符串的 首地址),决不是将字符串放到字符指针变量中; ⑵字符数组和字符指针变量都可以在定义时赋初值, 但以下方法对字符数组非法,对字符指针变量合法: char s[10]; s=“hello!”; ╳ char *ps; ps=“hello!”; √

⑶字符指针变量必须先赋值后使用,否则对系统构 成危险。因此,不可以如下编程:
char *ps; scanf(“%s”, ps); ╳ 而应写成:char *ps,s[10]; ps=s; scanf(“%s”, ps); √

⑷字符数组名是指针常量,只能表示一个确定的字 符串,不能改变。而字符指针变量的值是可以改变 的,它可以代表不同的字符串。 ⑸若定义了一个指针变量,并使它指向一个字符串, 就可以用下标形式引用指针变量所指字符串中的字 符。如:char *a=“I love China!”;

⑹用指针变量指向一个格式字符串,可以用它代替 printf函数的格式字符串。
如:int a; char *format; format=“a=%d\n”; 则:printf(format,a);相当于printf(“a=%d\n”,a);

printf(“%c”,a[5]);

⑺若把字符指针所指对象当作数组使用,应注意对 象的长度。 如:char str1[10],*ps=str1; ps[10]=?\0?; ╳

程序举例:将字符串a复制为字符串b。
main() { char a[]="I am a boy.", b[20]; int i=0; do { *(b+i)=*(a+i); i++; }while(*(a+i)!=?\0?); /* 也可写成while(*(a+i));*/ puts(b); }

上例程序还可写成:
main() { char a[]="I am a boy.", b[20],*p1=a,*p2=b; int i=0; do { *p2=*p1; p2++;p1++; }while(*p1!='\0'); /*也可写成 while(*p1);*/ puts(b); }

一、指针函数
返回指针的函数称作指针函数 。 指针函数定义函数首部的一般形式: 类型名 *函数名(参数表)
含意:函数的返回值是一个指针,它指向所定 义类型的数据 。 例如:int *a(int x, int y) ; /*函数原型声明*/ 含意:a是函数名,调用它以后能得到一个指 向整型数据的指针(地址)。

例: 编写能返回结果串地址的串拷贝函数。 #include "stdio.h " char *strcpy1(char* str1,char*str2); main() { char *ps, s1[80]="yhhhj"; ps=strcpy1(s1,"fdgjdfh"); puts(ps); } char *strcpy1(char *str1,char *str2) { char *s=str1; while(*str2) *str1++=*str2++; *str1='\0'; return s; *返回的指针必须在主调函数的可见域。 }

二、函数的指针及指向函数的指针变量
1. 函数的指针(地址)概念
每一个函数都占用一段内存,在编译时, 被分配一个入口地址,这个入口地址就称为 函数的指针。

2. 指向函数的指针变量
定义指向函数的指针变量的一般形式: 类型标识符 (*指针变量名)( ); 例如:float (*p)( ); 含意:定义了p是指向函数的指针变量,函数 的返回值是float类型。

注意: ⑴ (*p)()表示定义一个指向函数的指针变量, 它不是固定指向哪个函数。 ⑵ 对指向函数的指针变量,p+n, p++, p- 等运算是无意义的。 ⑶ 注意区别 int (*p)( )、int *p( )

3. 对指向函数的指针变量赋值
将一个函数的函数名(代表入口地址)赋 值给指向函数的指针变量,也称该指针变量指 向了这个函数。 如: int max(int x,int y);/*函数的原型声明*/ int (*p)(); p=max; 注意:赋值时,只需给出函数名而不必给出参数。

4. 函数的调用
通过函数名调用函数 函数的调用

通过指向函数的指针调用函数
当指向函数的指针变量p指向某一函数时 (即指针变量p被赋值),调用函数的形式为: (*p)(实参1,实参2,……) 即,只需将(*p)代替函数名即可。 例如:若有定义 int max(int x,int y); int (*p)() ,a,b,c ; p=max; 则可有语句 c= (*p) (a,b) ;

例: 求a和b中的大者 。 main() { int max(int,int); int (*p)(); int a,b,c; p=max; scanf(“%d,%d”,&a,&b); c=(*p)(a,b); printf(“a=%d,b=%d,max=%d”,a,b,c); } max(int x,int y) { int z; if(x>y)z=x; else z=y; return z; }

一、指针数组
指针数组:就是数组中每个元素是基类型相同 指针变量。 定义指针数组的一般形式: 类型标识符 *指针变量名[常量表达式];
例如: int *p[2]; 含意:p是一个一维指针数组,每个元素都是 一个指向整型变量的指针变量。可以 将 整型变量的地址赋值给元素p[0]或 p[1]。 注意:区别 int *p[2] 、int (*p)[2] 的含意。

二、指针数组的应用
1. 利用指针数组处理多个串 方法⑴:先用指针数组指向字符数组, 再处理。
main() { char name[][80]={"aaa","bbb","ccc","ddd","eee"}; char *pname[10], i ; for(i=0;i<5;i++)pname[i]=name[i]; for(i=0;i<5;i++)puts(pname[i]); } main() /*与用行指针解决上述问题比较*/ { char name[][80]={"aaa","bbb","ccc","ddd","eee"}; char (*pname)[80]=name, i ; for(i=0;i<5;i++)puts(pname[i]); }

方法⑵:用指针数组指向字符串常量。
main() { char *pname[10]={"aaa","bbb","ccc","ddd","eee"};
}

int i ; for(i=0;i<5;i++)puts(pname[i]);

2. 用指针数组指向动态内存 void指针类型介绍: 新标准增加了void指针类型,它用于定义一个 指针变量,但不指定它是指向哪种类型数据。在将 它的值赋给另一个指针变量时要进行强制类型转换 使之适合于被赋值的变量的类型。

例如: char *p1; int a=2; void *p2; p2=&a; p1=(char *)p2; void指针变量定义 强制类型转换 同样,可用 p2=(void *)p1; 将p1的值转换 成void 指针类型。 可以将一个函数定义为void 指针类型。表 示该函数返回的是一个地址,它指向空类型,如 需要引用此地址,也需要根据情况进行类型转换。 如, 库函数:void *malloc(unsigned size); 功能:分配size字节的存储区。 函数调用例: char *p; p=(char *)malloc(60);
分配60字节的存储区,并返回 该内存区的地址,并赋值给p 。

例:用指针数组指向动态内存,进行字符串的排序。

void sort(char *ps[ ],int n); void sort(char *ps[],int n) #define N 5 { int i, k; main() char *p,s[100]; { for(i=0;i<n-1;i++) char *ps[100],i; for(k=i+1;k<n;k++) for(i=0;i<N;i++) ps[i]=(char*)malloc(60); if(strcmp(ps[i],ps[k])<0) for(i=0;i<N;i++) { p=ps[i]; gets(ps[i]); ps[i]=ps[k]; sort(ps,N); ps[k]=p; for(i=0;i<N;i++) } puts(ps[i]); } }

3. 指针数组作main函数的形参 main函数是由系统调用的,可以有参数。 main函数实参: 实参是和命令一起给出的,也就是在DOS 提示符下,输入本程序的可执行文件名和需要传 给main函数的参数,命令行的一般形式为: 可执行文件名 参数1 参数2 …… 参数n 带参数的main函数的原型是: main( int argc, char *argv[ ]) ;

命令行参数(包括 可执行文件名) 的数目n+1

指针数组,各元素分别指向命令 行中的各参数(包括可执行文件 名),即字符串的首址

例:若以下面程序编译后生成可执行程序 file.exe, 在DOS提示符下按下述形式执行程序: file China Bejing Shenyang 写出程序运行结果。 #include <stdio.h> 运行结果: Shenyang Bejing China

main(int argc, char *argv[ ])
{ } while(--argc>0)

printf(“%s\n”, argv[argc]) ;

三、指向指针的指针变量
指向指针的指针变量(也称多级指针)只能 存放指针变量的地址。 定义形式: 类型标识符 **指针变量名; 例如:int **q, *p, i=5; p=&i; q=&p; 含意:使指针变量p指向i,指针变量q指向p。
q p i 4000 2000 5

4000 2000

注意:要使用一个多级指针 指向目标值,必须连续使用 指针运算符“*”。 例如:上例中**q就是i的值。

定 义 int *p ; int *p[n] ;

含 义 p为指向整型数据的指针变量 定义指针数组p,它有n个指向整 型数据的指针元素 int (*p)[n] ; p为指向含n个元素的一维数组的 指针变量 int *p( ) ; p为带回一个指针的函数,该指针 指向整型数据 int (*p)( ) ; p为指向函数的指针,该函数返回 一个整型值 int **p ; p是一个指针变量,它指向一个指 向整型数据的指针变量


相关文章:
(高二)第十一讲 针对训练 变压器
(高二)第十一讲 针对训练 变压器_理化生_高中教育_...①中性面是与磁场垂直时线圈所在的平面 ②线圈在...(用多少给多少) 输出电流 I2 决定输入电流 I1 9...
第十一章 第二讲 创新演练
第五章 第二讲 创新演练 暂无评价 6页 免费如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意见建议,请点击此处进行反馈。 ...
第十一讲 应用题(四)
第十一讲 应用题(四)_六年级数学_数学_小学教育_教育专区。第十一讲 应用题(...例2. 幼儿园的老师给小朋友发梨,每人 6 个就剩 12 个,每人 7 个便少 ...
第十一讲 实验2
第十一讲 实验2_理化生_高中教育_教育专区。考点综合训练 1.在做“互成角度...2.探究力的平行四边形定则的实验原理是等效原理,其等效性是指( ) A.使两...
C语言初学者入门讲座4
例如: int (*pf)();pf=f; /*f 为函数名*/ C 语言初学者入门讲座 第十一讲 针的慨念(2) 针的慨念(加入日期:2005-1-26) 【收藏文章】【对此文...
中医技术第十一章 皮肤针技术
中医技术第十一章 皮肤针技术_中医中药_医药卫生_专业资料。第十一章 皮肤针...二、常见疾病的皮肤针治疗技术 (一)斑秃 斑秃是头部毛发突然发生斑状脱落的...
表演与主持第十一讲
表演与主持第十一讲一、语音训练 轻重对立词: 天骄学校 二、绕口令 司小四和史小世,四月十四日十四时四十上集市,司小四买了四十四斤四两西红柿,史 小世买了...
第十一讲 电学综合题 (2012-04-29)
1/2 相关文档推荐 电学综合题(2012-06-04) 6页 2财富值 第十一讲 机械能...两电表的 均能达到某量程的满刻度处(在这过程中电表位置及量程都不能改变...
第十一讲 功和能
中学高中物理竞赛培训教材 第十一讲 功和能 一、知识点击 1.功、功率和动能...1 J ? 2 =常量 2 刚体机械能守恒. 二、方法演练 类型一、动力学中有些...
第十一讲案例(给学生)
第十一讲案例(给学生)_法学_高等教育_教育专区。专题十一案例: 案例一: 材料 ...三 大任务 是:第一,打仗消灭敌人;第二,打土豪筹款子;第三,做群众工作, ...
更多相关标签:
一来播讲的十一根手指 | 第十一根手指一来播讲 | 李春华十一讲虚指颤音 | 指南针财富大讲堂视频 | 指南针司考讲义 | 十一针封闭 | 打完破卵针十一天腰酸 | 针织十一厂退管会电话 |