第九章指针 9.1指针的概念 9.2指针变量 9.3指针与数组 94指针与字符串 9.5指针与函数 9.6返回指针值的函数 97指针数组和多级指针
9.1 指针的概念 9.2 指针变量 9.3 指针与数组 9.4 指针与字符串 9.5 指针与函数 9.6 返回指针值的函数 9.7 指针数组和多级指针 第九章 指针
假设已定义了三个变量itik编译时将变量名转换成变量的地址,对变量名的存I 都是对地址进行的。如prit9d3j的执行过程先找的地址20,从开始的两 字节取出数据如 : scant(“%od”,ci); 再如:k=计先从2002001取出的值,再从2002、2003取出j的值相加后将其和 入2004、2005字节单元中。这种按变量地址存取变量的方式叫直接存取方式 地地离香装和内查正南鑫落啊径益内元 字inti,k内存用户数据区号,地址 间接存取方式:将变量的地址里的° 的存单元中存 3 变量i 存放在另一个变量中,要存取变量200 的值,先找到存放i的地址的变量,从 变量j 中取出的地址(2002公后到2002 6 2001地址单元中存取的值在C中2004 变量k 可以定义整型变量、实型变量、 字符变量,也可以定义一种特殊的 变量,存放地址的变量。 point1=&i; point1的值就是30200 oint 1 2000.i的起始地址存取的值??
指针是C的一个重要概念和特色,使用指针可以有效的表示复杂的 数据结构;动态的分配内存;方便使用字符串和数组;能直接使用 内存地址;所以掌握指针的使用,能使程序高效、简洁。 9.1 地址和指针的概念 地址:如果在内存中定义了一个内存变量,在编译时给这个内存变量分配内存单元, 系统根据定义的内存变量的类型,分配一定长度的内存空间;(基本整型2,实型4, 字符型1)。内存区的每一个字节有一个编号,叫地址 。在地址所标志的内存单元中存 放数据。分别相当于旅馆里的房间号和房间号里的人。 内存单元的地址和内存单元的内容:如下定义: int i,j,k; 内存用户数据区 ┇ 3 6 9 ┇ 2000 变量 i 变量 j 变量k point_1 2000 2002 2004 3010 假设已定义了三个变量int i ,j ,k编译时将变量名转换成变量的地址,对变量名的存取 都是对地址进行的。如printf(“%d”,i);的执行过程先找i 的地址2000,从开始的两个 字节取出数据 如:scanf(“%d”,&i); 再如:k=i+j 先从2000、2001取出i的值,再从2002、2003取出j的值,相加后将其和放 入2004、2005字节单元中。这种按变量地址存取变量的方式叫直接存取方式 间接存取方式:将变量i的地址 存放在另一个变量中,要存取变量i 的值,先找到存放i的地址的变量,从 中取出i的地址(2000),然后到2000、 2001地址单元中存取i的值.在C中 可以定义整型变量、实型变量、 字符变量,也可以定义一种特殊的 变 量 , 存放地址的变量 。 point_1=&i; point_1 的值就是 2000,i的起始地址,存取i的值???
i=3将3送到变量有两种表示方法:9.2变量的指针和指向变量 (1)将3送到变量所标志的单元中的指针变量 2000 变量的指针:就是变量地址。 (2)将3送到变量p1nter1指针变量:就是存放变量地址的 “指向”的卓元中(所标的单靈量,用来指向另一个变量的的 变量。 ter 指针变量和它所指向的变量之间 2000 的关系用“”:表示“指向” 2000 如: pointer 1是指针变量, 指针;地址指向某一单元如 i*pointer1是 pointer1所指向的变量 号指向某一房间一样。C中将地址形 象化的称为指针,一个变量的地址称 pointer1 pointer 为该变量的指针。如2000是变量的200 指针。 2000 指针变量:如果某一变量专门用来存pier1也是一个变量, 放另一变量的地址(即指轨,则称其为和变量i是同一回赛 指针变量。指针变量中存放1=3;,* poiter1=3;两个语句的作用 针地址)。请区分指针变量 相同。* porter1=3.的意思是将3送到指针 概念。 变量 pointer1所指向的变量中
i=3;将3送到变量i中有两种表示方法: (1) 将3送到变量i所标志的单元中 3 i 2000 (2) 将3送到变量pointer_1所 “指向”的单元中(i所标志的单 元)pointer_1 2000 3 i 2000 指针: 地址指向某一单元如同房间 号指向某一房间一样。C中将地址形 象化的称为指针,一个变量的地址称 为该变量的指针。如2000是变量i的 指针。 指针变量:如果某一变量专门用来存 放另一变量的地址(即指针),则称其为 指针变量。指针变量中存放的值是指 针(地址)。请区分指针变量和指针的 概念。 9.2 变量的指针和指向变量 的指针变量 变量的指针:就是变量地址。 指针变量:就是存放变量地址的 变量,用来指向另一个变量的的 变量。 指针变量和它所指向的变量之间 的关系用“*” :表示“指向” 如: pointer_1是指针变量, *pointer_1是pointer_1所指向的变量 pointer_1 *pointer_1 2000 3 i 2000 *pointer_1也是一个变量, 和变量i是同一回事 i=3; *poiter_1=3; 两个语句的作用 相同。*ponter_1=3;的意思是将3送到指针 变量pointer_1所指向的变量中
《1》指针变量的定义:C中规定所有的变量必须先定义,按类型分 配内存单元。指针变量是专门用来存放地址的,必须将它定义为 针类型 如: 般格式: 基类型*指针变量 int l,i: float *pointer 3 int*pointer 1,*pointer 2 char *pointer 4 poiter1和 pointer2是两个指向整型变量的文里,mn炬垄尖型, 表示指针变量所能指向变量的类型 使指针变量指向另一个变量的方法: pointer1=&i;将变量的地址存放到变量 pointer1中, pointer1就指向了变量 pointer2=&j;将变量j的地址存放到变量 pointer2中, pointer2就指向 量j 说1)定义指针变量前面的“”表示变量的类型为指针型。变量 名是 pointer1称 ointer 2 2)定义指针变量时必须指定基类型(因为不同类型的变量在在 中点的存情空国不后在指针的运算中是不同的)一个看针交量 只能指同同一个类型的变量。如nr1、 pointer.2只能指整型 变量。 pointer1和 pointer2是整型变量,是poir1和ner2所指向 的变量。而 ointer1、 pointer2 是指针变量
《1》指针变量的定义:C中规定所有的变量必须先定义,按类型分 配内存单元。指针变量是专门用来存放地址的,必须将它定义为 “指针类型” 如: int i,j; int *pointer_1, *pointer_2; poiter_1和pointer_2是两个指向整型变量的指针变量,int 是基类型, 表示指针变量所能指向变量的类型 一般格式: 基类型 *指针变量 float *pointer_3; char *pointer_4; 使指针变量指向另一个变量的方法: pointer_1=&i;将变量i的地址存放到变量pointer_1中,pointer_1就指向了变量i pointer_2=&j; 将变量j的地址存放到变量pointer_2中,pointer_2就指向了变量j 说明(1) 定义指针变量前面的“*”表示变量的类型为指针型。变量 名是pointer_1和pointer_2 (2) 定义指针变量时必须指定基类型(因为不同类型的变量在内存 中占用的存储空间不同,在指针的运算中是不同的)一个指针变量 只能指向同一个类型的变量。如pointer_1、pointer_2只能指向整型 变量。 *pointer_1和 *pointer_2是整型变量,是pointer_1和pointer_2所指向 的变量。而pointer_1、pointer_2是指针变量
★变量与地址 内存中每个字节有一个编号-地址 内存 程序中:inti Q000 2001 float K, Q2002 编译或函数调用时为其分配内存单元 2003 2005 变量是对程序中数据 存储空间的抽象
变量与地址 程序中: int i; float k; 内存中每个字节有一个编号-----地址 …... …... 2000 2001 2002 2005 内存 0 2003 i k 编译或函数调用时为其分配内存单元 变量是对程序中数据 存储空间的抽象
指针与指针变量 指针:一个变量的地址 指针变量:专门存放变量地址的变量叫 指针 2000 整型变量i 2001 10 变量的地址 变量的内容 2002 2003 2004 变量 pointer 指针变量变量地址(指针) 指向 地址存入 指针变量 变量变量值
…... …... 2000 2004 2006 2005 整型变量i 10 变量i_pointer 2001 2002 2003 指针与指针变量 指针:一个变量的地址 指针变量:专门存放变量地址的变量叫~ 2000 指针 指针变量 变量的地址 变量的内容 指针变量 变量 变量地址(指针) 变量值 指向 地址存入 指针变量
★&与*运算符 含义 单目运就滑笨害法算转为 琏聋量的内容 优先级解优先级2 pointer *1 pointer &i pointer 2000 10 结合性:自 2000 整型变量i 2001 10 i pointer=&i=&*i pointer) 2002 *i pointer=*(&i) 2003 2004 变量 pointer 05 2666 2006 指针变量 I pointer 指针变量,它的内容是地址量 pointer--指针的目标变量,它的内容是数据 & I pointer-指针变量占用内存的地址
&与*运算符 ❖含义 含义: 取变量的地址 单目运算符 优先级: 2 结合性:自右向左 含义: 取指针所指向变量的内容 单目运算符 优先级: 2 结合性:自右向左 两者关系:互为逆运算 理解 …... …... 2000 2004 2006 2005 整型变量i 10 变量i_pointer 2001 2002 2003 2000 指针变量 i_pointer-----指针变量,它的内容是地址量 *i_pointer----指针的目标变量,它的内容是数据 &i_pointer---指针变量占用内存的地址 2000 10 i_pointer *i_pointer &i_pointer i i_pointer &i &(*i_pointer) i *i_pointer *(&i) i_pointer = &i = &(*i_pointer) i = *i_pointer = *(&i)
★直接访问与间接访问 ◆直接访问:按变量地址存取变量值 ◆间接访问:通过存放变量地址的变量去访问变量 例i=3 直接访问 20 整型变量i 2001 20 2002 2003 2004 变量 i pointer 2005 2666 指针变量 2006 例* I pointer=20: 间接访问
直接访问与间接访问 ❖直接访问:按变量地址存取变量值 ❖间接访问:通过存放变量地址的变量去访问变量 例 i=3; -----直接访问 指针变量 …... …... 2000 2004 2006 2005 整型变量i 10 变量i_pointer 2001 2002 2003 2000 3 例 *i_pointer=20; -----间接访问 20
直接访问 k=vi pointer 间接访问 000 整型变量1 2001 10 2002 整型变量k 2003|-1+0 2004 变量 i pointer 2005 2666 指针变量 2006
指针变量 …... …... 2000 2004 2006 2005 整型变量i 10 变量i_pointer 2001 2002 2003 2000 整型变量k 例 k=i; --直接访问 k=*i_pointer; --间接访问 10 例 k=i; k=*i_pointer;
§9.2指针变量 指针变量与其所指向的变量之间的关系 pointer 变量i K>*i pointer 2000 &i— 1 pointer *i pointer B3 i_pointer=3 指针变量的定义 一般形式:[存储类型]数据类型*指针名; 例/int Aeat蝽示定义指针变量 标识符 指计变量就蒲c是*e算符型 注意: 1、int*pl,*p2;与int*pl,p2; 2、指针变量名是plp2,不是p1,*p2 3、指针变量只能指向定义时所规定类型的变量 4、指针变量定义后,变量值不确定,应用前必须先赋值
§9.2 指针变量 指针变量与其所指向的变量之间的关系 指针变量的定义 一般形式: [存储类型] 数据类型 *指针名; 3 变量i 2000 i_pointer *i_pointer i *i_pointer &i i_pointer i=3; *i_pointer=3 3 变量i 2000 i_pointer *i_pointer i *i_pointer &i i_pointer i=3; *i_pointer=3 指针变量本身的存储类型 指针的目标变量的数据类型合法标识符 表示定义指针变量 不是‘*’运算符 例 int *p1,*p2; float *q ; static char *name; 注意: 1、int *p1, *p2; 与 int *p1, p2; 2、指针变量名是p1,p2 ,不是*p1,*p2 3、指针变量只能指向定义时所规定类型的变量 4、指针变量定义后,变量值不确定,应用前必须先赋值