C - Lab8-1 - 指针基本概念
更新时间:2024-01-30 20:05:01 阅读量: 教育文库 文档下载
- c罗推荐度:
- 相关推荐
课程:C语言程序设计 学号: 姓名: 班级:
实验8-1 指针基本概念
【知识点回顾】
1. 指针变量
1) 声明指针变量,如int x, * p;中,p为指针变量。
2) 初始化指针变量,如p=&x;令int指针变量p指向int变量x。 3) 通过指针变量访问数据,如scanf(“%d”,p); 2. 指针运算符
1) 间接访问运算符“*” 2) 取地址运算符“&”
【典型例题】
1. 例题1,指针的基本使用方法
#include
int main() {
int data=100;
int * pd; //声明指针变量 pd=&data; //初始化指针变量
printf(\变量的直接访问 printf(\变量的间接访问
printf(\变量的地址输出 printf(\指针变量的输出
return 0; }
【Q&A】
1. Q:指针变量为什么要进行初始化?
A:一般,变量的使用都需要经过声明、初始化后才能够使用,指针变量也不例外。如果变量空间未经初始化,那么存放的内容是个随机值,而指针变量的含义,即为它存放的地址是随机值。如果此地址恰好是系统正在使用的内存地址,那么该操作就将改写系统正在使用的某个数据,可能导致系统被破坏,由此可见,未经初始化就使用的指针十分危险,为了避免发生意外,最好给不能确定初值的指针变量赋以空值NULL,通常也把未经初始化就使用的
1
课程:C语言程序设计 学号: 姓名: 班级:
指针称为野指针。
2. Q:指针变量的地址就是指针存放的地址吗?
A:不是。如int x=5; int * p=&x;中,指针变量p是一个变量,系统要为它分配存储空间(通常为4个字节),该存储空间的起始地址即为指针变量的地址,即&p。而指针变量存放的地址,即,p中存放的变量x的地址信息,&x。
3. Q:指向不同数据类型的指针占用的内存空间大小都相同吗?
A:是的。无论指针指向哪种数据类型,所有指针所占内存空间大小都相同,只随机器硬件不同而不同。在32位机器上,所有指针变量都占用4个字节的空间。
4. Q:声明指针变量时“*”是运算符吗?
A:声明指针变量时,指针变量名前的“*”只表明当前被声明的变量不是普通变量,而是一个指针变量,不具有运算的含义。在运算表达式中,指针变量名前的“*”才是一个运算符。
5. Q:编译器如何判别“*”是乘号、间接访问运算符、还是用来声明指针?
A:编译器根据上下文来判别“*”的用途。如果它所在的语句以数据类型开头,则它用于声明一个指针变量;如果被用于一个已经声明过的指针变量名之前,则被判定为间接访问运算符;如果用于运算表达式中,且右边不是指针变量名,则被认为是一个乘法运算符。
【实验内容】
1. 设计程序,满足以下要求功能:
1) 声明两个单精度型变量x和y;x初始化为2.618; 2) 声明单精度型指针变量ptr_x,并指向x; 3) 输出ptr_x指向的变量的值;
4) 将ptr_x指向的变量的值加2后赋给变量y; 5) 输出变量y的值;
6) 用%p方式输出x和y的地址;
7) 用%p方式输出ptr_x,看看输出的值是否是x的地址。
#include
int main() {
float x=2.618,y; float *ptr_x=&x;
printf(\y=*ptr_x+2; printf(\
printf(\
2
课程:C语言程序设计 学号: 姓名: 班级:
printf(\}
2. 下列函数假设用来计算数组a中的元素和以及平均值,且数组a长度为n。avg和sum
指向函数需要修改的变量。函数含有几个错误,请找出这些错误并且改正。
void avg_sum(float a[], int n, float *avg, float *sum) { int i; sum=0.0;
for(i=0; i avg = sum/n; return 0; } #include void avg_sum(float a[], int n, float *avg, float *sum); int main() { float a[]={1,3,5,7,9},avg,sum; avg_sum(a,5,&avg,&sum); printf(\} void avg_sum(float a[], int n, float *avg, float *sum) { int i; *sum=0.0; for(i=0; i *avg = *sum/n; } *sum += a[i]; sum += a[i]; 3. 编写函数void swap(int *p , int *q);当传递两个变量的地址时,swap函数应该交换两者的值。提示:调用函数时可以使用swap(&x,&y);的形式。 #include 3 课程:C语言程序设计 学号: 姓名: 班级: { int x,y; scanf(\ printf(\ swap(&x,&y); printf(\ } void swap(int *p , int *q) { } 4. 编写函数void findLargest(int a[], int n, int *largest);当传递长度为n的数组a时, 函数将找到数组的最大值元素,并用largest指针变量指向它。提示:调用该函数进行测试时,可使用findLargest(a,10,&max);类似的形式。 #include void findLargest(int a[], int n, int *largest); int main() { int a[]={5,8,7,24,10,6,78,2,1,45},max=a[0]; findLargest(a,10,&max); printf(\ 4 int temp; temp=*p; *p=*q; *q=temp; 课程:C语言程序设计 学号: 姓名: 班级: } void findLargest(int a[], int n, int *largest) { } int i; for(i=1;i<10;i++) if(a[i]>*largest ) *largest=a[i]; 【课后练习】 1. 选择题: 1) 变量的指针,其含义是指该变量的 B 。 A. 值 B. 地址 C. 名 D. 一个标志 2) 若需要建立如图所示的存储结构,且已有声明float *p, m=3.14;则正确的赋值语 句是 B 。 A. p=m; B. p=&m; C. *p=m; D. *p=&m; 3) 有如下语句 int a=10, b=20, *p1, *p2; p1= &a; p2=&b; 如图1所示;若要实现图2所示的存储结构,可选用的赋值语句是 B 。 A. *p1=*p2 B. p1=p2; C. p1=*p2; D. *p1=p2; 4) 若有语句int *point, a=4; 和point=&a; 下面均代表地址的一组选项是 D 。 A. a, point, *&a B. &*a, &a, *point C. *&point, *point, &a D. &a, &*point, point 5) 若有以下声明和语句,则能表示a数组元素地址的表达式是 A 。 5 课程:C语言程序设计 学号: 姓名: 班级: double a[5], *p1; p1=a; A. a+0 B. p1+5 C. *p1 D. &a[5] 6) 若有以下声明int a[5], *p=a; 且0<=i<5, 则对a数组元素的非法引用是 D 。 A. a[i] B. *(a+i) C. *(p+i) D. *(&a+i) 7) 若有以下定义,则数值不为3的表达式是 C 。 int x[10]={0,1,2,3,4,5,6,7,8,9}, *p1; A. x[3] B. p1=x+3, *p1++; C. p1=x+2, *(p1++); D. p1= x+2, *++p1; 8) 若有声明:int * p, m=5, n; 以下正确的程序段是 D 。 A. p=&n; scanf(“%d”, &p); B. p=&n; scanf(“%d”, *p); C. scanf(“%d”, &n); *p=n; D. p=&n; *p=m; 9) 若有声明:int * p1, *p2, m=5, n;以下均是正确赋值语句的选项是 C 。 A. p1=&m; p2=&p1; B. p1=&m; p2=&n; *p1=*p2; C. p1=&m; p2=p1; D. p1=&m; *p2=*p1; 10) 有四对对指针变量进行操作的语句,以下判断正确的选项是 D 。 (1)int *p, *q; q=p; int a, *p, *q; p=q=&a; (2)int a, *p,*q; q=&a; p=*q; int a=20, *p; *p=a; (3)int a=0,b=0, *p; p=&a; b=*p; int a=20,*p,*q=&a; *p=*q; (4)int a=20, *p, *q=&a; a=q; int p, *q; q=&p; A. 正确:(1); 不正确:(2)(3)(4)。 B. 正确:(1)(4); 不正确:(2)(3)。 C. 正确:(3); 不正确:(1)(2)(4)。 D. 以上结论都不正确。 11) 如下代码调用scanf语句有错,其错误原因是 B 。 main() { int *p, *q, a,b; p=&a; printf(“input a: ”); scanf(“%d”, *p); ?? } A. *p表示的是指针变量p的地址。 B. *p表示的是变量a的值,而不是变量a的地址。 C. *p表示的是指针变量p的值。 6 课程:C语言程序设计 学号: 姓名: 班级: D. *p只能用来声明p是一个指针变量。 12) 以下选项中,对指针变量p的正确操作是 B 。 A. int a[5], *p; p=&a; B. int a[5], *p; p=a; C. int a[5]; int *p=a=1000; D. int a[5]; int *p1, *p2=a; *p1=*p2; 2. 下面程序的运行结果是 a=11 p=11 。 a=0 3. 下面程序的运行结果是 b=6 。 4. 下面程序的运行结果是 k=0 k=1 k=3 k=6 。 5. 下面程序的运行结果是 n1=1 n2=6 。 7 课程:C语言程序设计 学号: 姓名: 班级: 8
正在阅读:
C - Lab8-1 - 指针基本概念01-30
金砣 生产实习报告 - 图文09-29
三去一降一补的具体内容05-07
SUN-1QM-001质量手册--旧文件04-07
公司金融学 试题及答案03-12
二十年后的家乡作文800字07-14
小学数学一年级上册(北师大版)03-04
王元生书记在全省市场营销工作会议上的发言04-07
绩效与薪酬管理模拟试卷和答案07-03
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 指针
- 概念
- 基本
- Lab
- CRT显示器的工作原理
- 人教版小学四年级数学下册《加法运算定律 - 简便计算》教案
- 2011电子电工专业综合理论模拟试卷(附答案)
- 《朱容基讲话实录》(一至四卷 全集) 完整版PDF TXT 下载
- 《一元二次不等式解法》(第一课时)教学设计
- 《保险学》网上作业与课程考试复习资料
- 水浒传竞赛题目-选择题
- 高中通用技术会考模拟试题4及答案 - 图文
- 《关于调整襄樊市市区城镇职工基本医疗保险有关政策的实施意见》
- 赣州市人民政府关于印发赣州市政府投资建设项目代建制管理办法
- 江苏高院关于当前商事审判若干问题的解答(二)
- 液压与气动技术实训指导书 - 图文
- 五年级数学下册第三单元导学案
- 基于CAD技术的齿轮泵油槽
- 综采设备管理办法
- 装载机司机安全操作规程
- 唐山和平钢铁物流有限公司加工配送中心改造项目冬季施工方案 - 图文
- 政治学微博反腐
- 安全生产承诺书
- 大学计算机基础(文)(二)实验报告册电子稿