




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
指针《计算机软件基础》01.指向变量的指针02.指向数组的指针03.字符指针主要内容04.指针数组05.返回指针值的函数本章重点难点本章重点:指针变量的定义、初始化和赋值;利用指向变量、一维数组和字符串的指针变量来正确引用所指元素;各类指针变量的正确运用;返回指针值的函数的正确使用。本章难点:各类指针变量的正确运用;返回指针值的函数的正确使用。01指向变量的指针1.变量的内存地址C语言中访问变量值的方式有两种:1)直接存取方式:通过按变量的地址(即变量名)存取变量值的方式。例:scanf(“%d”,&x);
x=sqrt(x);printf(“%d”,x);2)间接存取方式:通过变量p间接得到变量x的地址,再存取变量x值的方式。2.指针变量的定义指针其实就是地址,是它所指对象的地址。指针变量:存放变量地址的变量,它用来指向另一个变量。指针变量的定义形式为:
类型名*指针变量名;例:int*p;注意:
①
例中指针变量是p,不是*p。②定义指针变量后,系统为其分配存储空间,用以存放其他变量的地址,但在对指针变量赋值前,它并没有确定的值3.指针变量的初始化1)在定义指针变量的同时给指针变量赋初值。2)先定义指针变量,然后赋值。intx,*p=&x;intx,*p;p=&x;等价注意:1)C语言规定,同类指针可以相互赋值。2)不同类型的指针不能相互赋值。3)一个指针变量只能指向同一类型的变量。例如:intx,*p1,*p2;p1=&x;p2=p1;例如:intx,z,*p1=&x;floaty,*p2;此时语句“p2=p1;”是错误的。4.指针运算符1)取地址运算符&&变量名2)取内容运算符**地址注:这里的变量指所有变量,包括下标变量,指针变量。注:“*”称为间接寻址符,即取出“*”后面地址中的内容。例如:intx=2,*p=&x;printf("x=%d\n",*p);取内容运算符含义示意图注意:1)定义语句中“p”前面的“*”是说明p的类型是指针变量。2)除定义语句外的其他语句中出现的“*p”里的“*”是对p所指变量的引用,即代表它指向的变量。3)*&x相当于“*(&x)”,&x是变量x的地址,*(&x)代表变量x。5.指针变量应用举例例5-2
分析下面两个程序的运行结果。#include<stdio.h>intmain(){inta,b,m,*p1=&a,*p2=&b;scanf("%d,%d",p1,p2);/*等价于scanf("%d,%d",&a,&b);*/m=*p1;*p1=*p2;*p2=m; /*等价于m=a;a=b;b=m;*/printf("%d,%d\n",a,b); printf("%d,%d\n",*p1,*p2);/*等价于printf("%d,%d\n",a,b);*/return0;}指针、变量关系示意图02指向数组的指针数组名代表存放数组元素的连续存储空间的首地址1.指向一维数组的指针变量的定义及初始化1)定义时赋初值。例如:intx[5],*p=x;
该语句定义了一个长度为5的整型数组x,和指向x数组的指针p。2)先定义,后赋值。例如:intx[5],*p;p=x;指向一维数组指针示意图2.一维数组元素地址和值的表示方法表5-1元素x[i]的地址和值的表示方法地址值下标法&x[i]x[i]指针法(地址法)x+i*(x+i)p+i*(p+i)程序1:使用数组首地址访问数组元素。#include<stdio.h>intmain(){intx[5],i;for(i=0;i<5;i++)scanf("%d",x+i);/*等价于scanf("%d",&x[i]);*/for(i=0;i<5;i++)printf("%d\n",*(x+i));/*等价于printf("%d\n",x[i]);*/return0;}程序2:使用指针访问数组元素。#include<stdio.h>intmain(){intx[5],i,*p=x;for(i=0;i<5;i++)scanf("%d",p+i);/*等价于scanf("%d",&x[i]);*/for(i=0;i<5;i++)printf("%d\n",*(p+i));/*等价于printf("%d\n",x[i]);*/return0;}程序3:通过移动指针访问数组元素。#include<stdio.h>intmain(){intx[5],*p,i;for(p=x;p<x+5;p++)scanf("%d",p);/*等价于scanf("%d",&x[i]);*/p=x; /*指针p重新指向数组首地址*/for(i=0;i<5;i++,p++)printf("%d\n",*p);/*等价于printf("%d\n",x[i]);*/return0;}p++即p=p+1,它是让p指针下移1个结点(指向下一个数组元素)。p+i中p指针未动,而p=p+i中p指针指向了第i个元素。p++的写法是正确的,但写x++是错误的。x+i是正确的,它代表x数组中第i号元素的地址,即&x[i]。03字符指针字符指针是指向字符型数据的指针变量。1.字符指针变量的定义和初始化C语言对字符串常量是按字符数组处理的,在内存中占用一段连续的存储空间存放字符串,并有唯一确定的首地址。用指针表示一个字符串分两步:①定义一个指向字符型的指针。②让该指针指向某一字符串,即将这个串的首地址赋给一个指针变量。例如:char*p="ChanganRoad";/*定义字符型指针变量p,指向串的首字符地址*/或char*p;p="ChanganRoad";指针p指向字符串例5-9
分析下列程序,写出运行结果。#include<stdio.h>intmain(){char*p="abcd";while(*p!='\0'){printf("%s\n",p);p++;}return0;}指针移动示意1)%s是字符串输入、输出格式字符。开始输出从p指针所指位置到结束符'\0'为止的所有字符。2)第一次执行p++的结果使p指向串″bcd″的起始地址,执行%s输出形式后,从b到'\0'的所有字符输出。程序运行结果如下:abcdbcdcdd04指针数组由若干基类型相同的指针所构成的数组1.指针数组的概念1)定义形式类型名*数组名[数组长度];例如:int*p[3];这里,p为指针数组名,说明p有3个元素,即3个指针,均为指向整型的指针变量,三个指针变量为p[0]、p[1]、p[2]。2)指针数组的赋值使用之前必须对数组元素进行初始化赋值后再引用。1)若定义:intx[3][4],*p[3],i;如果想用p的三个指针分别指向x数组各行,可用下列语句赋值。for(i=0;i<3;i++) p[i]=x[i];指针数组指向示意注意:①对二维数组x[3][4]来讲,x[i]代表第i行的首地址,即p[i]=&x[i][0]。②p[i]+j和x[i]+j是等价的,都代表x[i][j]的地址:*(p[i]+j)和*(x[i]+j)是等价的,都代表元素x[i][j]。③若一个二维数组的行数很多,要使多个指针分别指向各行,用指针数组运算更方便。2)若定义和赋值如下:inty[8],*p[2];p[0]=&y[0];p[1]=&y[5];指针指向示意2.指针数组应用举例#include<stdio.h>intmain()/*定义具有3个元素的指针数组,让各指针分别指向3个字符串首字符的地址*/{char*p[3]={"ab","abc","abcd"};inti;for(i=0;i<3;i++)printf("%s\n",p[i]);/*输出各个字符串*/return0;}程序运行结果如下:ababcabcd二维字符数组示意该程序中每个指针数组元素指向一个字符串,这3个字符串按各自的长度放在常量区。05返回指针值的函数一个函数的返回值是一个地址,多用于字符串运算。返回指针值的函数一般定义形式为:类型名*函数名(形参表)#include<stdio.h>int*max(inta[],intn){inti,*p=a; /*相当于inti,*p=&a[0];*/for(i=1;i<n;i++)if(*p<a[i]) /*若p所指当
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 多人股份车合同协议书
- 因为遇见你离婚协议书
- 自行处理协议书
- 船舶改装协议书
- 机械产品oem协议书
- 纸品经销协议书
- 联营合伙协议书
- 男女买房协议书
- 护理劳务合同和协议书
- 整形赔偿及修复协议书
- 中药材种植加工项目可行性报告
- 空调维保服务投标方案(技术标)
- 基于MATLAB仿真的烤箱的温度控制分析
- 22S803 圆形钢筋混凝土蓄水池
- 电信运营商社会渠道管理报告
- 2022-2023学年宁夏回族石嘴山市大武口区小学六年级第二学期小升初数学试卷含答案
- 经济与社会:如何用决策思维洞察生活学习通课后章节答案期末考试题库2023年
- 绿化设备车辆管理维护方案
- 2023汽车智能座舱分级与综合评价白皮书
- 外科学教学课件:肠梗阻阑尾炎
- 国开电大 可编程控制器应用实训 形考任务4实训报告
评论
0/150
提交评论