C语言指针练习题解析 下载本文

student worker

答案:(1)char *p[],int n

(2)*temp (3)p[j],p[j+1])>0 (4)p[j]=p[j+1]

分析:(1)由实参得知函数sort()有两个形参,根据上题得char *p[],int n。

(2)有下面语句temp=p[j]可以得到temp是字符中指针。 (3)根据冒泡排序方法和字符串比较函数得到p[j],p[j+1])>0。

(4)字符串指针可以通过赋值语句传递值,字符串变量不能够使用赋值语句传递值。

例题14:函数find功能是:在指针p所指数组中,查找值为x的元素,找到后,返回该元素的下标,否则返回-1,改正程序中语句错误,能够正确运行。 #include #include const int N=10;

int find(int *p,int n,int x) //1 { int i ; // 2 *(p+n)=x; //3 while(*p+i!=x) //4 i++; //5 if(i!=n) //6 return 1; //7 else return -1; //8 }

void main() {int i,pos,x; int *p=new int [N]; for(i=0;i *(p+i)=rand()P; for(i=0;i cout<<*(p+i)<<'\\t'; cout<<\ cin>>x; pos=find(p,N,x);

if(pos!=-1)cout<<\MARGIN-LEFT: ,value=\ else cout<<\ }

答案:(1) 2行语句改为 int i=0;

(2) 4行语句改为 while(*(p+i)!=x); (3) 7行语句改为 return i 。

分析:在函数find中,变量i没有赋初值,按照规则任意取值,所以程序不正确。在while循环条件中*p+i表示指针p指向地址元素值加i,不能起着指针移动作用,改为*(p+i)表示数组第i个元素值起着顺序查找作用。在函数中如果找到查找元素返回其下标,7行应该是return i ,而不是return 1。

例题15:写一个函数,将一个n阶方阵转置。具体要求如下:

(1)初始化一个矩阵A(5×5),元素值取自随机函数,并输出。 (2)将其传递给函数,实现矩阵转置。

(3)在主函数中输出转置后的矩阵。(提示:程序中可以使用C++库函数rand( ),其功能是产生一个随机数0~65535,其头文件为stdlib.h)

分析:根据题目要求,本题的关键是实现矩阵的转置,指针变量p指向矩阵c,由数组存放规则和指针变量的规则,得到下列程序: #include #include #include

int a[5][5],c[5][5]; //矩阵a、c定义为全局变量 void zc(int b[][5],int n); //函数声明语句 void main() {int i,j;

srand(time(NULL)); //产生一个时间 for(i=0;i<5;i++) for(j=0;j<5;j++)

*(*(a+i)+j)=rand()0 ; //产生一个随机数

cout<<\自动生成矩阵为:\\n\

for(i=0;i<5;i++) //输出自动生成的二维数组 {for(j=0;j<5;j++)

cout<<'\\t'<<*(*(a+i)+j);

cout< }

zc(a,5); //调用转置矩阵函数 cout<<\转置矩阵为:\\n\ for(i=0;i<5;i++) {for(j=0;j<5;j++)

cout<<'\\t'<<*(*(c+i)+j);

cout< } }

void zc(int b[][5],int n) {int i,j; int (*p)[5]; p=c;

for(i=0;i<5;i++) for(j=0;j<5;j++)

*(*(p+i)+j)=*(*(b+j)+i); // 转置 }

三、习题及参考答案

1.选择题:

(1)如果x是整型变量,则合法的形式是( )。

A.&(x+5)

B.*x

C.&*x 答案:D

(2)若有语句int a[10]={0,1,2,3,4,5,6,7,8,9},*p=a;则( )确引用(其中0≤i<10)。

A.p[i] B.*(*(a+i))

C.a[p-a]

答案:B

(3)以下程序的输出结果是( )。

#include

D.*&x

不是对a数组元素的正

D.*(&a[i])

void main()

{ int a[3]={10,15,20}; // a[0]=10,a[1]=15,a[2]=20 int *p1=a,*p2=&a[1]; // p1取a[0]地址,p2取a[1]地址 *p1=*(p2-1)+5; // a[0]=15,a[1]=15,a[2]=20 *(p1+1)=*p1-5; // a[0]=15,a[1]=10,a[2]=20 cout< } A.5

答案:B 分析:见程序注释

(4)执行以下程序段后,m的值为 ( )。

int a[2][3]={{1,2,3},{4,5,6}}; int m,*p=&a[0][0]; m=(*p)*(*(p+2))*(*(p+4)); A.15

答案:A

分析:C++语言,二维数组的存储方式在计算机中仍然是按一维数组存储,并按行优先,即是

先存储第 一行元素,接着存储第二行元素。语句p=&a[0][0]表示指针变量p取得二维数组第一个元素p[0][0]地址,注意不用语句p=a取二维数组首地址(同学考虑为什么?),*p、*(p+2)、*(p+4)的值分别为1、3、5,所以m=15。

(5)以下程序的输出结果是( )。

#include

void fun(int x,int y,int *cp,int *dp)

B.14

C.13

D.12

B.10

C.15

D.20