C程序设计谭浩强(第三版)指针参考答案.doc
文本预览下载声明
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])
显示全部