- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
– VC编译
warning C4133: '=' : incompatible types - from 'float *' to 'int *'
指针运算
算术运算
short *p, a[10];
6000
p = a;
6001
p++; /*p的值增加多少?*/
6002 6003
指针的加减运算是以其指向的
6004
类型的字节长度为单位的
6005 6006
p-1
p p+1
指针运算
int *p, *q, a[10]; p = a; q = &a[5];
–q - p – q = p + 5; 指针运算不能乱算 – 一般只进行指针和整数的加减运算,同类型指针之
间的减法运算
– 其它运算,比如乘法、除法、浮点运算、指针之间
间接(寻址)访问
– 通过指针变量来间接存取它所指
向的变量
3010
– i_pointer=&i;
内存用户数据区
┇
3
变量 i
6
变量 j
9
变量 k
┇
2000
变 量 i_p ointer
指针(Pointer)的概念
指针也是一种数据类型 指针变量
– 声明为指针类型的变量,专门存放地址数据的变量
如何定义指针变量?
ab
xy
程序 2
主调函数
实参
main() {
int a, b; a = 15; b = 8; Swap(&a, &b); printf("a=%d,b=%d",a,b); }
ab 59 95 &a &b
形 参 被调函数
void Swap(int *x, int *y) {
int temp; temp = *x; *x = *y; *y = temp; }
为什么引入指针的概念
指针 –为函数提供修改变量值的手段 –为C的动态内存分配系统提供支持 –为动态数据结构(如例链表、队列、二叉树等)提供支持 –可以改善某些子程序的效率
内存的寻址方式
如何读写内存中的数据?
– 通过变量的地址访问变量所在的
存储单元
0
两种寻址方式
直接(寻址)访问
2000
– 通过变量地址直接存取变量内容2002 2004
定义指针变量 int *p;
– 定义了一个指针变量p,简称指针p
p是变量,int*是类型
指针变量初始化 – int *p,a; – p = &a; – *p 与 a 完全等价
int i; float *p; p=&i;
一个指针变量不能 指向与其类型不同 的变量!
应在类型相 同的指针变 量之间赋值
int *p; float *q; p=q;
int i,*p; p=&i;
我是真的, 你猜对了吗?
指针变量只 存放地址!
int *p; p=100;
&与*操作符
&用来取变量的地址 *用来取指针指向的内存中的内容
int i=3, *p; p = &i; printf(“*p=%d”,*p); int *p, a[10]; p = a; *p=20; 等价于 a[0]=20;
int *p, a[10]; p = &a[0]; *p=20; int *p, a[10]; p = &a[5]; *p=20;
指针变量与其它类型变量的对比
共性
– 在内存中占据一定大小的存储单元 – 先定义,后使用
特殊性 – 它的内容只能是地址,而不能是数据 – 必须初始化后才能使用,否则指向不确定的存储单元,
– 两数的互换
例7.1~7.2:编写函数实现两数的互换
程序 1
程序 2
main() {
主调函数
int a, b;
a = 15;
b = 8; Swap(a, b);
实参
printf("a=%d,b=%d",a,b);
}Hale Waihona Puke main() {int a, b; a = 15; b = 8; Swap( &a, &b ); printf("a=%d,b=%d",a,b); }
对该空间进行访问,将可能造成危险
– 可参与的运算:加、减一个整数,自增、自减、关系、
赋值
– 只能指向同一基类型的变量
指针的指向
只能指向同一基类型的变量,否则将引起warning – float x; – int *p = &x; – TC编译
warning: Suspicious pointer conversion in function main
void Swap(int x,int y) 被调
void Swap(int *x,int *y)
{
函数
{
int temp; temp = x; x = y;
形参
int temp; temp = *x;
y = temp;
*x = *y;
}
*y = temp;
结果有何不同?}
程序 1
主调函数
实参
main() {
temp
5
xy
&a &b
ab
xy
简单变量作函数参数与指针变量作函数参数的比较
a
b
a
b
a
b
15
8
main
函数 Swap
函数
赋值运算 指针在使用前一定要赋值 为指针变量赋的值必须是一个地址
main() {
错! 但TC下不报错
VC下报错
int *p;
scanf("%d",p);
…
}
main() {
int a,*p=&a; scanf("%d",p); … }
指针与函数
指针既然是数据类型,自然可以做函数参数和返回值 的类型 指针做函数参数的经典例子:
内容提要
指针概述 – 指针的概念 – 为什么引入指针的概念 – 指针变量作为函数参数 – 字符指针作为函数参数
指针和数组间的关系 – 一维数组的地址和指针 – 二维数组的地址和指针
为什么引入指针的概念
铁杆C/C++程序员最挚爱的武器:指针 C/C++的高效、高能主要来自于指针 很多不可能的任务由指针完成
int a, b; a = 15; b = 8; Swap(a, b); printf("a=%d,b=%d",a,b); }
a
b
5
9
形 参 被调函数
void Swap(int x, int y) {
int temp; temp = x; x = y; y = temp; }
temp
5
xy
59 59
的加法等,并无意义,所以也不支持
指针运算
关系运算 指向同一种数据类型的两个指针才能进行关系运算
– 值为1或0
p > q p < q p == q
不能与非指针类型变量进行比较,但可与NULL(即0 值)进行等或不等的关系运算
– 判断p是否为空指针 – P == NULL – p != NULL
指针运算