文档详情

C程序设计谭浩强(第三版)指针参考答案.doc

发布:2015-09-02约1.66万字共20页下载文档
文本预览下载声明
C语言程序设计 (第三版) 谭浩强 第10章 指针参考答案 【知识要点】 简单地说指针就是地址。 一个变量可以通过变量的名称进行访问,也可以通过该变量的指针进行访问。 直接访问:变量的存取就是对相应存储单元的存取。 间接访问:通过指针变量来存取。如图将变量m的地址存放在另一变量p中,通过指针变量p来访问变量m。若已定义,int i=10,*p; 要使指针变量指向整型变量i,则需将整型变量的地址赋给指针变量,即p=i。如图所示 图 指针运算符的运算 i:整型变量,其值为10。 i:整型变量i的地址,内存编号2000。 p:指针变量,它的内容是地址量,整型变量i的地址2000。 *p:指针指向整型变量i的值,其值为10。 p:指针变量占用内存的首地址,内存编号2004。 由此可存在下列等价关系: p i (*p),i *p *(i) 本章重点与难点:指针与一维数组,指针与字符串,指针与多维数组。 【指针与一维数组】 若已有定义:int a[5],*p=a; p+i与a+i等价,是a[i]的地址,即等价于a[i]。 *(p+i)或*(a+i)为p+i或a+i所指向的数组元素,即*(p+i)*(a+i)和a[i]三者等价。 指向数组元素的指针,也可以表示成数组的形式,也就是说,指针变量带下标,p[i]与*(p+i)等价。 若有定义:int a[3][4]; 该二维数组a可看成为数组元素为a[0],a[1],a[2]的一维数组,而每个数组元素又为含有四个数组元素的一维数组的首地址。由此二维数组的数组名 a为二级数组指针,如图所示。 图 二维数组a[3][4]的二维表示 说明: 数组名为a[i]的数组元素分别为:a[i][0]、a[i][1]、a[i][2]、a[i][3],a[i]为首地址,即a[i]等价于a[i][0]。 a[i]+j 表示第i行第j列的数组元素的地址,即等价于 a[i][j]。 a是二维数组的首地址,也是数组元素分别为{a[0],a[1],a[2]}的一维数组的首地址,a+i表示该数组中第i个数组元素的地址,即a、&a[0]、a[0]、a[0][0]都表示同一存储单元,a+i等价于a[i]。 a[i]、a[i]是等同的。因为在二维数组中不能把a[i]理解为元素a[i]的地址,不存在元素a[i]。C语言规定,它是一种地址计算方法,表示数组a第i行首地址。由此,a[i],a[i]、*(a+i)和a+i都是等价的。 由上所述, a[i]、*(a+i)和a[i][0]是等价的。a[i]+j、*(a+i)+j和a[i][j]是等价的。*(a[i]+j)、*(*(a+i)+j)和a[i][j]是等价的。 二维数组名a实现a+i运算时,按行移动,移动到二维数组的第i行,因此称为行指针,数组指针a[i]实现a[i]+j运算时,按列移动,移动到第i行的第j列,因此称为列指针。 数组指针是常量,不能实现++运算。如a++、a[0]++都是错。 若已有定义: int a[3][4],(*p)[4]; 二维数组a包含a[0],a[1],a[2]为首地址的一维数组,指针变量p,指向包含4个元素的一维数组。 若有p=a,存在以下的等价关系: p等价于a、a[0]或a[0][0]。 p+i则指向一维数组a[i],等价于a+i。 *(p+i)+j是二维数组第i行第j列的元素的地址,*(p+i)+j *(a+i)+j a[i]+j a[i][j]。 *(*(p+i)+j)是二维数组第i行第j列数组元素的值,*(*(p+i)+j) *(*(a+i)+j) *(a[i]+j) a[i][j]。#include stdio.h void swap (int * p1,int * p2) {int p; p=* p1;* p1= * p2;* p2=p; } void main ( ) {int n1,n2,n3; printf(“Input three int n1,n2,n3:”); scanf(“%d%d%d”,n1,n2,n3); printf(“%d,%d,%d\n”,n1,n2,n3); if (n1n2) swap (n1,n2); if (n1n3) swap (n1,n3); if (n2n3) swap (n2,n3); printf(“sort:%d,%d,%d\n”,n1,n2,n3); } 10.2输入3个字符串,按由小到大的顺序输出。 【解析】多个字符串的处理方法:一是二维数组,二是指针数组或指向一维数组的指针变量。 #include stdio.h #include string.h #define N 3 void swap(char (*p)[80])
显示全部
相似文档