C语言教程课件第七章 指针

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3.两个运算符 *: &: 求其后内存地址中的内容 求变量的内存地址.
[例] main()
{int a,b; 程序运行结果: 100,10 100,10
int *p1,*p2;
a=100;b=10;
p1=&a;
p2=&b;
printf("%d,%d\n",a,b);
printf("%d,%d\n",*p1,*p2);
int sum(int a, int b) { return a+b; } void add1(int a, int b, int c) { c=a+b; } void add2(int a, int b, int *c) { *c=a+b; }
考虑函数调用时,

三个函数的参数传递情况 内存中变量的值的变化情况
}
再例:由下列图(a)形式,
P1 &a a
P2 &b 图(a)
b
执行语句: p2=&*p1后,
变为图(b)形式。
这时: *p1为a,*p2为a, p1=p2 = &a
p1 &a p2 &a b a
图(b)
思考: 1.若已执行了“p1=&a”,则: “&*p1”的含意是什么?
2. *&a的含意是什么?
第7章 指针
7.1 指针的概念
7.2 指针变量 7.3 函数间传递地址值
7.1 概念
1.数据在内存中的存储方式: 按数据类型给在内存为其分配一定数 量的存储单元(字节)。 2.内存单元的地址: 内存单元的编号,与变量名对应。
3.内存单元的内容: 即变量的值。
例如有定义:
a
int a; char c; float x; 变量a,c,x的内存分配情况:
四.指针的指针
------指向指针变量的指针. 定义形式: 类型 **变量名; 例如: int i,*p,**q; i=30; p=&i; q=&p;
1000 1001
内存示意图:
i
2000
1000
p
3000
2000
q
7.3 函数之间传递地址值

看下面的程序
void main() { int x=3,y=4,z=5; z=sum(x,y); printf(“sum:z=%d\n”,z); x=3,y=4,z=5; add1(x,y,z); printf(“add1:z=%d\n”,z); x=3,y=4,z=5; add2(x,y,&z); printf(“add2:z=%d\n”,z); }

3. (*p1)++相当于什么?
[例]对输入的两个整数按大小顺序输出 p p a p1 a a main() &a {int *p1,*p2,*p,a,b; 5 &a &a 5 5 p1 a a=5;b=9; p1 p1 p2 &a b p1=&a;p2=&b; ① 5 &b &b &b 9 p if (a<b) p2 b &a { p=p1; ② &b 9 (1 初始) p2 b p2 b p1=p2; ③ &a 9 9 p2=p; } ④ &b 3 执行p2=p1后 printf("a=%d,b=%d\n",a,b); 2 执行p=p1后 4 执行p2=p后 printf("max=%d,min=%d\n",*p1,*p2);}
3.说明
标识符前面的“*”,表示该变量为指针变量。但 指针变量名是*后面的名字(不包括“*”)。 该指针所指向变量的类型成为指针变量的基类型。
二.指针变量的赋值
指针变量名=某一地址;
方式1: 指针变量名=&变量名; 方式2: 指针变量名=另一已经赋值的指针变量; 方式3: 通过调用库函数malloc和calloc在内存中开 辟动态存储单元; 方式4: 还可以给指针变量赋NULL值。


再看下面的程序(同上例) void main() { int x=3,y=4; swap1(x,y); printf(“1:x=%d,y=%d”,x, y); swap2(&x,&y); printf(“2:x=%d,y=%d\n”, x,y); }
void swap1(int a, int b) { int t; t=a; a=b; b=t; }
8.2 指针与变量
一. 指针变量的定义和指针变量的基类型 1. 定义方式:
类型标识符 *指针变量名;
float *p1; (定义了p1为指向实型变量的指针变量) char *p2; (定义了p2为指向字符型变量的指针变量)
2. 指针变量的三要素:
指针变量的基类型: 和其所指变量的类型一致; 指针变量的值:另一个变量在内存的地址; 指针变量的名字:起法同普通变量。
例如: int i,*p,*q,*r,*t; p=&i; /*方式1*/ q=p; /*方式2*/ r=malloc(4); t=NULL;
p i的地址 i i的值
示 意 图
q
i的地址
三.指针的运算
1.移动指针 对指针变量加上或减去一个整数、或通 过赋值运算,使指针指向相邻的存储单元 在p++中,1不代表一个字节,而是一 个存储单元,具体字节数由指针的基类型决 定 2.指针的比较和相减 相减得一整数,代表两指针所指存储单 元之间相距的单元数,不是字节数。
内存用户数据区示意图:
变量的值用10进制示意
内存地址
.. 2000 2004 2008 3 6 9 变量i 变量j 变量k
...
3010 2000 ... 变量pointer
变量pointer为指针变量,存放的是变量i的 内存地址,我们说pointer指向i。
6.指针的概念: 一个变量的地址称为该变量的指针。
x c
4.变量的“直接访问”方式:
按变量的地址(即变量名)存取变量值的
方式。(见下图)
直接访问:
2000
i
3
5.变量的“间接访问”方式
将变量的地址放在另一个内存单元中,先
到另一个内存单元中取得变量的地址,再由变
量的地址找到变量并进行数据存取(见下图)。
间接访问方式示意图: pointer 2000 2000 i 3
void swap2 (int *a, int *b) { int t; t=*a; *a=*b; *b=t; }
函数传递参数的形式

传值和传(地)址


相同点:形参之间都是单向值传递,函数 调用结束后,所有的形参变量都被系统收 回 不同点:

传值时,形参变量的值不变
传址时,形参为指针,其对应的变量的值会发 生改变
相关文档
最新文档