文档介绍:第 8 章指针
指针概念
变量的指针和指向变量的指针变量
指针变量的定义
指针与数组
指针变量的引用
字符串的指针和指向字符串的指针变量
指针与函数
指向结构体类型数据的指针
动态数据结构
第 8 章指针
指针概念
指针是C的一个重要概念。其特点是:
能有效地表示复杂的数据结构;
能动态地分配内存,直
接处理内存地址;
能方便、有效地使用字符串和数组;
能在调用函数后获得多个值。
C中定义的变量,在编译时按变量的类型来分配一
定长度的内存单元。在运行时,根据变量名与地址的对
应关系,相应地存取变量的数据。这种按变量地址存取
变量值的方法称为“直接访问”方式。
如果变量的地址也存放在某一个内存单元,则存取
方式为先找到存放变量的地址单元,再取变量的值,这
种方式称为“间接访问”方式。
如:
p=&i ;
将变量 i 的地址存放到变量p “指向”的内存单元中
变量的指针和指向变量的指针变量
变量的指针就是变量的地址,即p
的值。也就是说, 指针变量的值就是该
指针变量所指变量的内存首地址。
在p的前面加上一个“* ”,即*p就
表示指针变量p所指向的变量。
从右图可知:
*p也是一个变量,且与变量 i 是同
一回事。
i = 3;
p=&i;
*p=3;
将3赋给指针变量p所指向的变量,与 i=3 等价
用户数据区
2000 3 变量 i
2002 6 变量 j
2004 9 变量 k
3010 2000 变量 p
指针变量的定义
定义形式:
类型标识符*标识符;
指针变量必须定义为“指针类型”。
如:
int i, j;
i
j
int *p1, *p2;
p1
p2
p1=& i; p2=& j;
p1, p2 为指向整型变量 i, j 的指针变量。
说明:
类型可以是整型、实型、字符型等。
标识符前的“* ”表示该变量为指针变量。
指针变量只能指向同一类型的变量。
上述的指针变量是p1、p2,而不是*p1、*p2。
*p1 和*p2 是 p1 和 p2 所指向的变量 i 和 j 。
*p1
*p2
指针变量中只能存放地址。
p1=100; 是非法的
指针变量的引用
与指针有关的运算符:
& 取地址运算符
如:&a 为变量 a 的地址
指针运算符
如:*p为指针变量p所指向的变量
运算和& 运算互为逆运算。
指针变量p的内容为地址量;
p
*p
x
*p=i; 是将变量 i 的值赋给目标变量*p。
i
&p 为指针变量 p 的地址。
&p
&(*p)的结果为p,即变量*p也就是变量x的地址。
*(&i) 表示访问变量 i 的
地址,结果就是 i 本身。
至此,你应该明白了
p、*p和&p的意义。
&x
*p为指针p的目标量,内
容为数据,即指针变量 p 所指向的变量的值。
main( )
{ int a, b;
int *p1, *p2;
a=100; b=10;
p1=&a; p2=&b;
printf(“%d,%d\n”,a, b);
printf(“%d,%d\n”, *p1, *p2);
}
将变量 a 和 b 的地址赋给指针变量p1和p2
*p1和*p2 就是变量 a 和 b
运行结果:
100, 10
100, 10
说明:
若先执行p1=&a; 再执行&*p1; 是什么意思? 这里
“&”和“* ”的优先级相同,但按“自右至左”结合, 即
&*p1与&a相同。
p1
a
&*p1
而p2=&*p1; 的作用是将&a 赋给p2。
p2
若先执行p1=&a; 则*&a和*p1的作用相同。即:
*&a与a是等价的
(*p1)++ 等价于a++。
*p1
*&a
括号是必须的,否则就成为
*(p1++)。这时先按 p1 的原值进行
* 运算得到 a 的值。然后使p1的值
改变,则p1不再指向 a 了。
注意:
main( ){int *p1, *p2, *p, a, b; scanf(“%d%d”,&a,&b); p1=&a; p2=&b; if (a<b) { p=p1; p1=p2; p2=p; } printf(“a=%d,b=%d\n”, a, b);
printf(“max=%d,min=%d\n”,*p1,*p2);}
a
b
p1
p2
&a
&b
5
9
p
运行情况: 5 9
注意:此