文档介绍:指针
C程序设计中使用指针可以:
使程序简洁、紧凑、高效
有效地表示复杂的数据结构
动态分配内存
得到多于一个的函数返回值
指针与指针变量
地址和指针的概念:
…...
…...
2000
2002
2005
内存
0
程序中: int i;
float k;
i
k
内存中每个字节有一个编号-----地址
地址→指针
指针:一个变量的地址
指针变量:专门存放变量地址的变量叫指针变量
指针与指针变量:
…...
…...
2000
2002
2005
内存
0
例:int i=10;
int *p;
p=&i;
i
10
p
2000
2000
p
10
i
指针变量的定义与初始化:
指针变量的定义:
一般形式: 数据类型*指针名;
合法标识符
指针的目标变量
的数据类型
表示定义指针变量
不是‘*’运算符
例: int *p1,*p2;
float *q ;
1. int *p1, *p2; 不能书写成 int *p1, p2;
2. 指针变量名是p1,p2 ,不是*p1,*p2
3. 指针变量只能指向定义时所规定类型的变量
4. 指针变量定义后,变量值不确定,应用前必须先赋值
注意:
指针变量如何指向变量?
初始化方法:数据类型*指针名=初始地址值;
例 int i;
int *p=&i;
例 int *p=&i;
int i;
例 int i;
int *p=&i;
int *q=p;
变量必须已说明过且类型一致
用已初始化指针变量作初值
赋值方法:
例 int i , *p ;
p=&i;
指针变量必须赋值才能使用
例 main( )
{ int i=10;
int *p;
*p=i;
printf(“%d”,*p);
}
…...
…...
2000
2004
2006
2005
整型变量i
10
指针变量p
2001
2002
2003
随机
例 main( )
{ int i=10,k;
int *p;
p=&k;
*p=i;
printf(“%d”,*p);
}
危险!
指针变量与其指向变量的关系:
指针运算符与地址运算符:& *
&:取地址运算符
*: 指针运算符,或指向运算符
例 int i=10;
int *p=&i;
2000
p
10
i
变量i: i *p *(&i)
变量 i 地址:&i p &(*p)
例:通过指针变量访问整型变量
main( )
{ int a=100, b=10;
int *p1, *p2;
p1=&a; p2=&b;
printf(“%d, %d\n”,a,b);
printf(“%d, %d\n”,*p1,*p2);
}
100
a
10
b
p1
p2
100
a
10
b
&a
p1
&b
p2
直接访问与间接访问
直接访问:按变量的地址存取变量的值
间接访问:通过存放变量地址的变量去访问变量
对“&“和“*“运算符的补充说明
若有“p1=&a”,则&*p1代表?
*&a的含义?
分析:先进行&a运算,得a的地址,再进行*运算。即&a所指向的变量,a的地址所指向的变量就是a,因此*&a与a等价
分析:因为++和*为同一优先级,且都为右结合性,因此它相当于*(p1++),由于是“后加”,因此先对p1的原值进行*运算,得到a的值,然后使p1的值改变,这样p1不再指向a了
若有“p1=&a”,(*p1)++代表?
若写成*p1++,作用就不一样了