第七章 指针1指针的优势1、从函数得到多个返回值 —— 传地址的概念 2、对字符串的灵活处理(排序、查找、连接、 输出) 3、构造链表、树、图等数据结构
1/14
第
十
章
指针内存区:…… 03H 00H 06H 00H 0AH 00H …… 00H 20H …… 变量i
一、内存的概念:1.计算机内存:由若干个存储单元(字节)构 2000H 成[字节的线性序列] 2001H2002H 2.存储单元的内容和地址: 2003H 每个存储单元都有一个编 2004H 2005H
变量j变量k 变量p1
号,此编号称为内存单元的 地址;内存单元中的数据 (二进制),称为内存单元 的内容。
3010H 3011H
2/14
第
十
章
指针内存区:…… 03H 00H 06H 00H 0AH 00H …… 00H 20H …… 变量i
二、变量与内存的关系:
1 .变量: 变量具有变量名和变量值;变 量还具有类型。 2.变量与内存的关系: 变量的值存放在内存单元中,
2000H 2001H 2002H 变量名对应其值所在内存区的 2003H 首地址;(存储区第一个存储单元 2004H 2005H 的地址)
变量j变量k 变量p1
3.直接访问: 3010H 通过变量地址对变量值的访问 3011H 称为直接访问[通过变量名得到首 地址,根据变量类型取若干单元的 内容] 。
3/14
第
十
章
指针内存区:…… 2000H 2001H 2002H 2003H 2004H 2005H 03H 00H 06H 00H 0AH 00H …… 00H 20H …… 变量i
三、变量的指针和指针变量:1 .变量的指针:变量对应内存区的首地址称为变 量的指针。[指针即地址]
2.指针变量:它的内容为某个地址 ——存放指针的变量
变量j变量k 变量p1
3.间接访问:
通过指针变量得到一个地址,再 3010H 得到该地址的内容 3011H
4.变量与指针变量的差别:都是变量,但内容不同
5/14
四、指针变量的定义 1、定义的一般格式: 数据类型说明符 *指针变量名; 说明: 1)一个指针变量只能指向同一类型 (“数据类型说明符”)的变量; 2)变量名前的“*”表示该变量为指针类型变量; 3)指针变量的初始化(取址操作符&、同类型) 例:int *p1; 指向整型变量的指针变量p1; char *p2; 指向字符型变量的指针变量p2; 指针变量p1所指变量:整型变量*p1 [两个变量: 指针变量p1及所指变量*p1]6/14
2、指针变量的引用:指针变量的初始化:p = &i; 或 p=a; /* a为数组名 */指针变量所指变量的内容
引用形式:指针变量名 —— 指针变量的内容(一个地址)*指针变量名 ——
相关运算符1) &:取地址运算符(变量或数组元素适用—取变量的首地址)2) *:指针运算符(指针变量适用;注意与定义时的*不同) 3)=:赋值运算符 [p、*p均可,含义不同] 4)算术运算符+、-及++、-- [p、*p均可,含义不同] 例:&a 为变量a的地址, *p 为指针变量 p所指向的变量 执
行p=&a;后,a 等价于*p a 等于 *&a; p 等于 &*p7/14
例:int a=5; a++;
a,*p; 指针变量的初始化:指向某个具体对象 变量的初始化 变量a的值(内容)增1:a的值为6
p=&a;
(*p)++;p++; *(p++);
变量*p(即a)的值增1:为7指针变量p指向下一个整型变量 使用后再加
8/14
例:输入a和b两个整数,按先大后小的顺序输出a和b。main( ) { int a、b并未交换值, 仅仅改变了p1和 scanf(“%d,%d”,&a,&b); p2的值 p1=&a; p2=&b; 实际输出的是 if (a<b) {p=p1; p1=p2; p2=p;} 变量b、a的值 (见下图) printf(“a=%d,b=%d\n”,a,b); *p1,*p2,*p,a,b; } a
printf(“max=%d,min=%d\n”,*p1,*p2); p1 p1 a p &b p &a 5 p2 p2 b
5b
&b
9
&a
9
9/14
3、指针变量作为函数参数
变量——传值;指针变量——传地址 [实参、形参均为指针类型] 例:编制函数swap及指针变量,对输入的两个整数 按大小顺序输出。(函数swap完成排序,主函数完成输 入、输出)
10/14
如果我们将swap( )函数作如下改变,结果将怎样呢?swap(p1,p2)
int
*p1,*p2;p1=p2; int
地址传递也是单向传递!
{ int *p; p=p1; main( ) { int a,b; *pointer_1,*pointer_2; pointer_2=&b; p2=p; }
scanf(“%d,%d\n”,&a,&b);pointer_1=&a; if (a<b) swap(pointer_1,pointer_2);11/14
printf(“\n%d,%d\n”,*pointer_1,*pointer_2);}
关于地址传递的进一步说明:1.定义 n 个变量,并让 n 个指针变量指向 它们; 2.使用地址(指针)作为实参; 3.在函数中使用形参指针改变变量的值; 4.在主函数中可使用改变后的值;
12/14
指针1(总结) 地址和指针的概念(指针即地址) 变量的指针和指向变量的指针变量(指针变 量的定义、引用:&、*) 指针变量作为函数参数(地址传递)
13/14
作业:9.1
14/14