第10章指针
§——变量指针与指针变量
标识符名(id):给变量、数组、函数命名,可逻辑地按名访问。
地址(addr):字节地址是硬件系统按字节编码的地址;单元地址是编译系统为数据分配的存储单元的入口地址。本章所论的地址(addr)是单元地址,简称指针(“数据对象”的入口地址)。
符号表(id/addr):编译时刻建立的,记录id/addr信息,用于id与addr之间的映射。
直接存取:根据标识符名(id)的地址存取数据。例如:c=a+b;其赋值过程:按变量名a检索符号表,获得变量a的地址是2000;直接读取2000、2001两个字节中的值,……..。
一、地址与指针概念
int a,b,c;
a=3;b=5;c=a+b;
符号地址内存单元
3
5
8
a 2000
b 2002
c 2004
间接存取:设法把标识符名(id) 的地址存入另一特殊变量中(指针变量),使指针变量指向特定的id,然后通过指针变量间接地存取它所指向的数据。
如何实现:一级指针概念
int *pa,*pb,*pc; //定义指针变量,只能指向整型变量,初值不确定
pa=&a;pb=&b;pc=&c; //确定指针变量的指向
*pa=3;*pb=5; //间接访问:根据pa获得指针2000,然后将3存入2000、2001字节
*pc=*pa+*pb; //间接访问(存取)
如何实现:二级指针概念
int **p2a,**p2b,**p2c;//定义指针变量,只能指向整型的指针变量,初值不确定
p2a=&pa;p2b=&pb;p2c=&pc;//确定其指向
**p2a=3;**p2b=5; //多级地间接访问
**p2c=**p2a+**p2b;
2000
2002
2004
pa 2010
pb 2012
pc 2014
2010
2012
2014
P2a 2020
P2b 2022
P2c 2024
符号地址内存单元
3
5
8
a 2000
b 2002
c 2004
二、定义及其引用规则
使用方法:①定义指针变量;
②确定指针变量的指向;
③间接存取指向的值。
符号地址内存单元
a 2000
b 2002
c 2004
2000
2002
2004
pa 2010
pb 2012
pc 2014
int a,b;float c;
/*定义、初始化指针变量*/
int *pa=&a,*pb=&b;
float *pc;//pc只能指向实型变量,
初值不确定, “*”是指针说明符,指针变量名是pc
/*指针变量赋值(确定指向)*/
pc=&c; //赋于实型数据的指针,确定指向
pc=2004; //错误!Pc不能赋于常数值
pc=&a; //错误! Pc不能赋于实型变量的指针
/*如何引用指针变量:间接存取数据*/
c=a + b ; //作用域内按符号引用变量值
*pa=8 ; //*是指针运算符, 间接引用
*pb=88 ;
*pc=*pa+*pb;//间接引用
scanf(“%f”,pc);//对 scanf(“%d”, &pc); //错!
printf(”%f”,*pc); printf(”%f”, pc);
printf(”%d”, a);
等价于printf(”%d”,*(&a) );
&与*互逆:*(&a)等价于直接引用a
//如何交换指针变量的指向?
int *temp; temp=pa; pa=pb; pb=temp;
//如何交换指向的值?
int temp; temp=*pa; *pa=*pb; *pb=temp;
符号地址内存单元
8
88
96
a 2000
b 2002
c 2004
2000
2002
2004
pa 2010
pb 2012
pc 2014
/*算术运算*/
pa++; //语法正确,但pa自加后,pa的指向不明
pa=pa+8; //语法正确,但加8后,pa的指向不明
int s[5]={1,2,3,4,5},*ps ;
ps=&s[0]; 或 ps=a; // 使p指向数组a,a是一级指针常量
ps=ps+2; //pa指向a[2]元素
scanf(“%d”, ps+2 ); //输入a[4]元素
printf(”%d”, *ps); //输出a[2]元素的值3
ps=a;
printf(”%d”, ps[2] ); //输出a[2]的值3
*(p+2)等价于p[2], p[2]理解为地址偏移且间接访问
三、指向指针的指针(多级指针)
如何建立如下指向关系:
地址符号内存单元
3
2000
2012
2016
2000 a
2012 p1
2016 p2
2020 p3
int a
C101 指 针(上) 来自淘豆网www.taodocs.com转载请标明出处.