C语言程序设计(第3版)何钦铭 颜 晖 第8章 指针.doc

上传人:飞****9 文档编号:134118598 上传时间:2020-06-02 格式:DOC 页数:16 大小:50.50KB
返回 下载 相关 举报
C语言程序设计(第3版)何钦铭 颜 晖 第8章 指针.doc_第1页
第1页 / 共16页
C语言程序设计(第3版)何钦铭 颜 晖 第8章 指针.doc_第2页
第2页 / 共16页
C语言程序设计(第3版)何钦铭 颜 晖 第8章 指针.doc_第3页
第3页 / 共16页
C语言程序设计(第3版)何钦铭 颜 晖 第8章 指针.doc_第4页
第4页 / 共16页
C语言程序设计(第3版)何钦铭 颜 晖 第8章 指针.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《C语言程序设计(第3版)何钦铭 颜 晖 第8章 指针.doc》由会员分享,可在线阅读,更多相关《C语言程序设计(第3版)何钦铭 颜 晖 第8章 指针.doc(16页珍藏版)》请在金锄头文库上搜索。

1、第8章 指针【练习8-1】如果有定义”int m, n = 5, *p = &m;”与m = n等价的语句是 B 。A m = *p; B. *p = *&n; C. m = &n; D. m = *p;解答: A:p是指向m的指针变量,所以*p等价于m。即m=m。 B:&n是n的地址,*&n是n的值,即把n的值赋给p指向的值m。即m=n。 C:&n是n的地址。即把n的地址赋给m。 D:*p是指p指向的指针所指向的值,在此无意义。 故选B。 【练习8-2】调用函数求两个数的和与差:计算输入的两个数的和与差,要求自定义一个函数sum_diff(float op1,float op2, float

2、 *psum, float *pdiff),其中op1和op2是输入的两个数,*psum 和*pdiff 是计算得出的和与差。解答:#includevoid sum_diff(float op1,float op2,float *psum,float *pdiff);int main(void) float op1,op2,sum,diff; printf(Input op1 and op2: ); scanf(%f%f,&op1,&op2); sum_diff(op1,op2,&sum,&diff); printf(%f+%f=%f;%f-%f=%f n,op1,op2,sum,op1,op

3、2,diff); return 0;void sum_diff(float op1,float op2,float *psum,float *pdiff) *psum=op1+op2; *pdiff=op1-op2;【练习8-3】两个相同类型的指针变量能不能相加?为什么?解答:不能。因为指针变量是一种特殊的变量,指针变量的值存放的是所指向变量的地址,两个地址相加并不能保证结果为一个有效的地址值,因而在 C 语言中指针变量相加是非法的。【练习8-4】根据表 8.2 所示,这组数据的冒泡排序其实循环到第 6 遍(即n-2)时就已经排好序了,说明有时候并不一定需要 n-1 次循环。请思考如何改进冒泡

4、排序算法并编程实现(提示:当发现一遍循环后没有数据发生交换,说明已经排好序了)。解答:设置一个标志变量 flag,进入一轮循环前设置为 0,在循环中有发生数据交换就改写flag 值为 1。当该轮循环结束后检查 flag 值,如果变为 1 说明发生了数据交换,还没有排好序,如果为 0 说明没有发生交换,已经排好序。#includevoid bubble (int a,int n);int main(void) int n,i,a8; printf(Enter n (n=8):); scanf(%d,&n); printf(Enter a%d : ,n); for(i=0;in;i+) scanf

5、(%d,&ai); bubble(a,n); printf(After sorted, a%d=, n); for(i=0;in;i+) printf(%3d,ai); return 0;void bubble(int a, int n) int i,j,temp,flag; for(i=1;in;i+ ) flag=0; for(j=0;jaj+1) temp=aj;aj=aj+1;aj+1=temp; flag=1; if(flag=0) break; 【练习8-5】重做例 8-9,要求使用选择排序算法。解答:#includevoid bubble(int a, int n);int ma

6、in(void) int i,n,a8; printf(Enter n (n=8): ); scanf(%d,&n); printf(Enter a%d :,n); for(i=0;in;i+) scanf(%d,&ai); bubble(a,n); printf(After sorted, a%d=,n); for(i=0;in;i+) printf(%3d,ai); return 0;void bubble(int a,int n) int i,j,temp,index; for(i=0;in-1;i+) index=i; for(j=i+1;jn;j+) if(ajaindex) ind

7、ex=j; temp=ai;ai=aindex;aindex=temp; 8.4电码加密【练习8-6】在使用scanf( )函数时,输入参数列表需要使用取地址操作符&,但当参数为字符数组名时并没有使用,为什么?如果在字符数组名前加上取地址操作符&,会发生什么?解答:因为字符数组名的值是一个特殊的固定地址,可以看作是常量指针,因此不需要再使用取地址符来获取该数组的地址。如果在字符数组名 str 前加上取地址操作符&,那么对其取地址&str 可以看做是这个数组的第一个元素的地址,由于数组地址和数组第一个元素的地址相同,所以&str 表示地址值和 str 表示的地址值是相等的。对 scanf()的变

8、长参数列表的话,编译器只负责参数传递,怎么解释后边的几个地址的含义,是由前边的字符串确定的。所以使用scanf(“%s”,str)和scanf(“%s”,&str)都能通过编译且正常执行。【练习8-7】 C 语言不允许用赋值表达式直接对数组赋值,为什么?解答:数组名可以看作是常量指针,因为不可以对一个常量进行赋值,所以不允许用赋值表达式直接对数组进行赋值。【练习8-8】输入一个字符串,把该字符串的前 3 个字母移到最后,输出变换后的字符串。比如输入“abcdef”,输出为“defabc”。解答:#include#include#define MAXLINE 100int main(void)

9、char lineMAXLINE,str4;int i; printf(Input the string:); gets(line); if(strlen(line)3) printf(字符串长度小于3,不符合要求!n); for(i=0;i3;i+) stri=linei; stri=0; for(i=3;linei!=0;i+) linei-3=linei; linei-3=0; strcat(line,str); printf(%s%sn,After changing: ,line); return 0;【练习8-9】使用动态内存分配的方法实现例 8-9 的冒泡排序。解答:#includ

10、e#includevoid bubble(int a,int n); int main(void)int n,j,*a,i,temp; printf(Enter n(n=8):);scanf(%d,&n);if(a=(int*)calloc(n,sizeof(int)=NULL) printf(Not able to allocate memory.n); exit(1);printf(Ente a%d:,n);for(i=0;in;i+) scanf(%d,a+i); bubble(a,n); printf(After sorted,a%d=,n);for(i=0;in;i+) printf

11、(%3d,*(a+i); free(a); return 0;void bubble(int a,int n) int i,j,temp; for(i=1;in;i+) for(j=0;j*(a+j+1) temp=*(a+j); *(a+j)=*(a+j+1); *(a+j+1)=temp;习题8一、选择题1.下列语句定义 x 为指向 int 类型变量 a 的指针,其中哪一个是正确的 B 。Aint a, *x = a; B. int a, *x = &a;Cint *x = &a,a; Dint a, x = a;2. 以下选项中,对基本类型相同的指针变量不能进行运算的运算符是 A 。A+ B- C= D=3若有以下说明,且 0=i10,则对数组元素的错误引用是 C 。int a = 0,1,2,3,4,5,6,7,8,9, *p = a,i;A*(a+i) Bap-a+i Cp+i D*(&ai)4下列程序的输出结果是 B 。int main(void)int a10 = 0,1,2,3,4,5,6,7,8,9, *p = a+3;printf(“%d”, *+p); return 0;A3 B4 Ca4的

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 管理论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号