指针是C语言中的一个概念.ppt_第1页
指针是C语言中的一个概念.ppt_第2页
指针是C语言中的一个概念.ppt_第3页
指针是C语言中的一个概念.ppt_第4页
指针是C语言中的一个概念.ppt_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第十章 指针,指针是C语言中的一个概念,正确而灵活地运用指针,可以有效地表示复杂的数据结构、难动态分配内存、方便使用字符串和数组、能使函数返回一个以上的结果、能直接使用内存地址等。,本章内容包括: 10.1 地址和指针的概念 10.2 变量的指针和指向变量的指针变量 10.3 数组与指针 10.4 字符串与指针 10.5 指向函数的指针 10.6 返回指针值的函数 10.7 指针数组与指向指针的指针,10.1地址和指针的概念,一、指针概述: 1、地址的概念与取地址运算: 内存以字节编码,每个编码都是一个地址。我们原先学过的变量、数组、函数等都放在内存中,在程序中,我们是通过变量名等使用变量、给变量赋值等,但实际运行时,系统使用的是内存地址,而不是变量名。我们怎样知道机器将某种数据放在内存的什么地方呢?可用求地址运算符 看出其地址。注意,这个地址并不是始终不变的,这是由机器和操作系统来安排的,我们无法预先知道。,在数组中,数组名代表数组的首地址 故a表示的地址和&a 0的地址相同。 但&不能施加在常数、常量或表达式上,也不能施加在寄存器变量上(因为寄存器变量在cpu中,不在内存中)。 二、指针变量: 既然存储在内存中的各种变量都有一个地址,我们能否这样设想:定义某种变量,让这个变量的值等于某个变量的地址,如同某个房间号、门牌号一样?回答是肯定的。我们把这种存放某种变量地址的变量称为指针变量。,a,b,2010,2012,因此,在C语言中,将地址形象化地称为指针,说明(系统对变量的访问形式分为两种) 一个变量的访问(访问是指取出其值或向它赋值)方式有两种: (1)直接访问,通过变量名访问,如通过变量名i直接访问。 (2)间接访问,通过该变量的指针来访问,如通过指针p访问变量i。,1.内存地址内存中存储单元的编号 (1)计算机硬件系统的内存储器中,拥有大量的存储单元(容量为字节)。 为了方便管理,必须为每一个存储单元编号,这个编号就是存储单元的“地址“。每个存储单元都有一个惟一的地址。 (2)在地址所标识的存储单元中存放数据。 注意:内存单元的地址与内存单元中的数据是两个完全不同的概念。 2.指针即地址 一个变量的地址称为该变量的指针。通过变量的指针能够找到该变量 2.变量地址系统分配给变量的内存单元的起始地址。 假设有这样一个程序:,main() int i; scanf(“%d“,“时,存取变量i值的方式可以有两种:,(1)直接访问直接利用变量的地址进行存取 1)上例中scanf(“%d“,&i)的执行过程是这样的: 用变量名i作为索引值,检索符号表,找到变量i的起始地址2000;然后将键盘输入的值(假设为)送到内存单元2000和2001中。此时,变量i在内存中的地址和值,如图10-1所示。 2)printf(“i=%dn“,i)的执行过程,与scanf()很相似: 首先找到变量i的起始地址2000,然后从2000和2001中取出其值,最后将它输出。 (2)间接访问通过另一变量访问该变量的值 语言规定:在程序中可以定义一种特殊的变量(称为指针变量),用来存放其它变量的地址。,例如,假设定义了这样一个指针变量i_pointer,它被分配到3010、3011单元,其值可通过赋值语句“i_pointer=i;“得到。此时,指针变量i_pointer的值就是变量i在内存中的起始地址2000,如图10-1所示。 通过指针变量i_pointer存取变量i值的过程如下: 首先找到指针变量i_pointer的地址(3010),取出其值2000(正好是变量i 的起始地址); 然后从2000、2001中取出变量i的值(3)。 (3)两种访问方式的比较 两种访问方式之间的关系,可以用某人甲(系统)要找某人乙(变量)来类比。 一种情况是,甲知道乙在何处,直接去找就是(即直接访问)。 另一种情况是,甲不知道乙在哪,但丙(指针变量)知道,此时甲可以这么做:先找丙,从丙处获得乙的去向,然后再找乙(即间接访问)。,10.2 变量的指针和指向变量的指针变量,(1)指针即地址 一个变量的地址称为该变量的指针。通过变量的指针能够找到该变量。 (2)指针变量专门用于存储其它变量地址的变量 指针变量i_pointer的值就是变量i的地址。指针与指针变量的区别,就是变量值与变量的区别。 (3)为表示指针变量和它指向的变量之间的关系,用指针运算符“*“表示。 例如,指针变量i_pointer与它所指向的变量i的关系,表示为: *i_pointer,即*i_pointer等价于变量i。 因此,下面两个语句的作用相同: i=3; /*将3直接赋给变量i*/ i_pointer= /*将3赋给指针变量i_pointer所指向的变量*/,10.2.1定义一个指针变量,指针变量的定义一般形式为: 基类型 *指针变量名;,例如: int i, j, *pi, *pj; float x, y, *p1, *p2; 指针变量的赋值:使得指针变量指向变量 指针变量名 注意:指针变量只能存放指针(地址),且只能是相同类型变量的地址。 例如,指针变量pi、pj,只能接收int型、p1, p2只能接收float型的地址,否则出错。,10.2.2 指针变量的引用,在程序中,可以用:*指针变量名 代替其所指变量。如若 int i, *p; p= 的作用相同,即可用*p代替i,这里*号称为指针运算符(或称为间接访问运算符),例10.1 通过指针变量访问整型变量 main() int a, b, point_1, point_2; a=100; b=10; point_1=,例10.2 输入a和b两个整数,按先大后小的顺序输出a和b的值 main() int a, b, *p, *p1, *p2; p1= ,10.2.3 指针变量作为函数参数,实参:变量地址或已赋值的指针变量,形参:指针变量 功能:地址传送方式,会将改变后的值带回。,例10.3 通过函数调用实现例10.2的功能。 swap(int *p1, int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp; main() int a, b, *pointer1,*pointer2; scanf(“%d%d“, ,例10.4 输入3个整数,按降序(从大到小的顺序)输出。要求使用变量的指针作函数调用的实参来实现。 void exchange(int *pointer1, int *pointer2) int temp; temp=*pointer1, *pointer1=*pointer2, *pointer2=temp; main() int a,b,c; printf(“Input the first number: “); scanf(“%d“, ,10.3 数组与指针,10.3.1指向数组元素的指针 1.概念 数组的指针数组在内存中的起始地址,用数组名表示 2.指向数组的指针变量-赋于数组名的指针变量 例如,int a 10, *p=a (或*p=,10.3.2 通过指针引用数组元素 如果有“int a 10,*p=a;” ,则: (1)p+i=a+i=&ai。 (2)*(p+i)=*(a+i)=ai。 (3)pi*(p+i)ai。 注意:p+1指向数组的下一个元素,而不是简单地使指针变量p的值+1。其实际变化为p+1*size(size为一个元素占用的字节数)。 例如,假设指针变量p的当前值为3000,则p+1为3000+1*2=3002,而不是3001,例10.5 输出数组的全部元素,#include void main() int a10,i,*p; for(i=0;i10;i+) scanf(“%d“, /用指针变量指向数组元素 ,说明: (1)指针变量的值是可以改变的,所以必须注意其当前值,否则容易出错。 (2)指向数组的指针变量,可以指向数组以后的内存单元,虽然没有实际意义。 (3)对指向数组的指针变量(px和py)进行算术运算和关系运算的含义如下: 1)可以进行的算术运算,只有以下几种: pxn:将指针从当前位置向前(+n)或回退(-n)n个数据单位,而不是n个字节。 px-py:两指针之间的数据个数,而不是指针的地址之差。,2)关系运算 表示两个指针所指地址之间、位置的前后关系:前者为小,后者为大。 例如,如果指针px所指地址在指针py所指地址之前,则pxpy的值为1。,例:通过指针变量输出数组的10个元素 #include void main() int *p,i,a10; p=a; for(i=0;i10;i+) scanf(“%d“,p+); printf(“n“);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论