C - Lab8-1 - 指针基本概念
更新时间:2024-04-13 06:46:01 阅读量: 综合文库 文档下载
课程: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 - 指针基本概念04-13
铭记这一天作文600字06-18
国学经典诵读主持稿07-26
相似性原理与量纲分析09-17
湖北省武汉市黄陂区部分学校2015 - 2016学年八年级物理下学期3月月考试卷(含解析)新人教版01-06
四年级上册 数学总复习 好好09-17
班主任的经验4篇07-25
思无邪经典读后感10篇12-12
测风工安全操作规程示范文本04-14
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 指针
- 概念
- 基本
- Lab
- 山西省晋中市2015-2016学年高二上学期期中数学试卷(文
- 财政违法行为处罚处分条例讲课稿
- 缠论精华版
- 药师经内的十二药叉大将之法 此法灵验无比 感应迅速
- 千秋煤矿200万吨新井通风安全设计 - 毕业设计 - 图文
- 浅析如何解决当代中国“新三座大山”的看法
- 2018年宁波市专技人员继续教育公需课-心理调节十二法100分答案
- 《一元二次不等式解法》(第一课时)教学设计
- 国开行政管理本科《公共政策概论》历年期末考试试题及答案汇编
- 《建筑设备工程》平时作业
- 不动产登记信息管理基础平台建设总体方案
- 妙极了与糟透了-教案
- 公开课听课后体会感想
- C616数控机床改造
- 《国际贸易实务》重要概念与复习思考题及答案(外语2012)
- 外汇业务题库(2016年版)
- 王力《汉语史稿》 复习提纲(练习题)
- 胰腺癌 - 图文
- 八数学1.1.3等腰三角形教学设计
- 2009年实践能力模拟试题