没有合适的资源?快使用搜索试试~ 我知道了~
C语言程序设计第3版何钦铭 颜 晖 第8章 指针.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 21 浏览量
2022-07-11
20:03:52
上传
评论
收藏 54KB DOC 举报
温馨提示
试读
26页
C语言程序设计第3版何钦铭 颜 晖 第8章 指针.doc
资源推荐
资源详情
资源评论
第 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
*psum, float *pdiff),其中 op1 与 op2 是输入的两个数,*psum
与*pdiff 是计算得出的与与差。
解答:
#include<stdio.h>
void sum_diff(float op1,float op2,float *psum,float *pdiff);
int main(void)
float op1,op2,sum,diff;
printf("Input op1 and op2: ");
第 2 页
scanf("%f%f",&op1,&op2);
sum_diff(op1,op2,&sum,&diff);
printf("%f+%f=%f;%f-%f=%f
\n",op1,op2,sum,op1,op2,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 次
循环。请思考如何改进冒泡排序算法并编程实现(提示:当发现一遍
循环后没有数据发生交换,说明已经排好序了)。
解答:
设置一个标志变量 flag,进入一轮循环前设置为 0,在循环中有发
生数据交换就改写 flag 值为 1。当该轮循环结束后检查 flag 值,
如果变为 1 说明发生了数据交换,还没有排好序,如果为 0 说明
没有发生交换,已经排好序。
第 3 页
#include<stdio.h>
void bubble (int a[],int n);
int main(void)
int n,i,a[8];
printf("Enter n (n<=8):");
scanf("%d",&n);
printf("Enter a[%d] : ",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
bubble(a,n);
printf("After sorted, a[%d]=", n);
for(i=0;i<n;i++)
printf("%3d",a[i]);
return 0;
void bubble(int a[], int n)
int i,j,temp,flag;
for(i=1;i<n;i++ ){
flag=0;
for(j=0;j<n-i;j++)
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
第 4 页
a[j+1]=temp;
flag=1;
if(flag==0)
break;
【练习 8-5】重做例 8-9,要求使用选择排序算法。
解答:
#include<stdio.h>
void bubble(int a[], int n);
int main(void)
int i,n,a[8];
printf("Enter n (n<=8): ");
scanf("%d",&n);
printf("Enter a[%d] :",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
bubble(a,n);
printf("After sorted, a[%d]=",n);
for(i=0;i<n;i++)
printf("%3d",a[i]);
return 0;
void bubble(int a[],int n)
int i,j,temp,index;
第 5 页
for(i=0;i<n-1;i++){
index=i;
for(j=i+1;j<n;j++)
if(a[j]<a[index]) index=j;
temp=a[i];
a[i]=a[index];
a[index]=temp;
8.4 电码加密
【练习 8-6】在使用 scanf( )函数时,输入参数列表需要使用取地址
操作符&,但当参数为字符数组名时并没有使用,为什么?如果在字
符数组名前加上取地址操作符&,会发生什么?
解答:
因为字符数组名的值是一个特殊的固定地址,可以看作是常量指针,
因此不需要再使用取地址符来获取该数组的地址。如果在字符数组名
str 前加上取地址操作符&,那么对其取地址&str 可以看做是这个
数组的第一个元素的地址,由于数组地址与数组第一个元素的地址相
同,所以&str 表示地址值与 str 表示的地址值是相等的。对 scanf()
的变长参数列表的话,编译器只负责参数传递,怎么解释后边的几个
地址的含义,是由前边的字符串确定的。所以使用 scanf(“%s”,str)
与 scanf(“%s”,&str)都能通过编译且正常执行。
【练习 8-7】 C 语言不允许用赋值表达式直接对数组赋值,为什么?
解答:
剩余25页未读,继续阅读
资源评论
kfcel5889
- 粉丝: 3
- 资源: 5万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功