当前位置:
文档之家› 最新中国地图行政区划矢量图教学讲义ppt
最新中国地图行政区划矢量图教学讲义ppt
char *s1 , *s2 ;
在这里定义了三个指针变量pd、s1和 s2,其中指针变量pd的基类型为double类 型,在指针变量pd中,只能存放double类 型变量的地址,指针变量s1和s2的基类型 为char类型,在指针变量s1和s2中只能存 放char类型变量的地址。又如:
int **p ;
以上是定义了一个指向指针的指针变 量p,该指针变量p只能存放基类型为int类 型的指针变量的地址。又如:
int *pi , **p , k ; 以上语句是在同一语句中,同时定义 了指针变量pi、指向指针的指针变量p和变 量k,这是允许的。
7.2.2 指针变量的基类型的作用
任何一个指针变量都是用于存放它所 指向变量的地址,只要能存放地址就可以 了,为何还要区别不同的基类型呢?
注意:变量名前的星号“*”不可省略, 若省略了星号“*”说明符,就变成了普通 整型变量。
int是数据类型名,在这里,说明了pi 和pj是两个指向整型(int类型)变量的指 针,也就是说变量pi和pj中只能存放int类 型变量的地址,这时我们称int是指针变量 pi和pj的基类型。又如:
double *pd ;
其原理是:不同的数据类型变量,C 语言系统为它们开辟的存储空间的字节数 是不同的,
int类型的数据存储空间是2个字节, float类型的数据存储空间是4个字节,……,
系统表示每一个存储空间的地址时,是取 该存储空间的第1个字节的地址作为该变量 存储空间的地址。那么当一个基类型为int 类型的指针变量p指向了一个int类型的变 量a时,是将该变量a所占的2个字节的存储 空间中的第1个字节存储空间的“地址”存 入指针变量p中,如图7-2(b)所示。
图7-2 指针和指针所指向的对象
所以根据指针变量p中存放的“地址”, 只能寻找到变量a第1个字节的存储空间, 如果只提取变量a所占存储空间第1个字节 的数据,显而易见不是int类型变量a的原 值,因为变量a的原值是通过2个字节来存 储的数据。此时我们可以通过指针变量p的 基类型解决问题,知道了变量a的第1个字 节的地址,再根据指针变量p的基类型为 int类型,系统就将从变量a的第1个字节所 在的地址开始,连续提取2个字节中的数据, 此时的数据就是int类型变量a的原值。
同理,基类型为float类型的指针变量,根据 指针变量中存放float类型变量的地址值,可以寻 找到所需存储空间中的第1个字节所在位置,然 后再根据基类型为float类型,连续地提取4个字 节中的数据,作为被访问的数据,这才是float类 型变量中存放的真实数据。由此,我们可以看到
指针变量在定义时,其基类型是何等的重要。因
7.2 指针变量的定义和指 针变量的基类型
7.2.1 指针变量的定义和指针
变量的基类型
定义指针变量的一般形式如下: 类型名 *指针变量名1,*指针变量名
2,……;
例如:int *pi , *pj ;
以上定义语句中,pi和pj都是用户标 识符,表示具体的变量名,现在每个变量 名前加一星号“*”说明符,用来说明所定 义的变量是指针变量。
中国地图行政区划矢量图
第7章 地址和指针
7.1 地址和指针的概念 7.2 指针变量的定义和指针变量的基类型 7.3 给指针变量赋值 7.4 对指针变量的操作 7.5 指针在函数方面的应用
例7.1 欲想调用fun函数,计算出两个 数相加和相减的值,然后在main函数中显 示结果。
程序如下:
fun ( int x , int y )
假设程序运行时给变量a输入8,给变 量b输入5,程序运行结果:
a=8 , b=5 8 + 5=0 8 – 5=0
程序运行结果与我们“想象”的不一
致,为什么呢?其原因是fun 函数中变量 add和sub与main函数中变量add和sub各自 占用自己的存储单元,因此fun函数中变量 add存放的两个数的求和值无法传回到 main函数的变量add中,同理,fun函数中 变量sub存放的两个数的相减值也无法传回 到main函数的变量中。下面我们修改一下 源程序,借助指针,将fun函数中运行的结 果传回到main函数中。
此,定义什么样的基类型指针变量,该指针变量
只能存放什么样类型变量的地址,两者必须一致, 否则就可能出现了张冠李戴的错误现象。
7.3 给指针变量赋值
7.3.1 使指针指向一个对象
1.通过求地址运算符(&)把
一个变量的地址赋给指针变量
“&”是求地址运算符,该运算符为 单目运算符,用于求变量的地址,且该变 量必须为内存变量。
{ int add=0 , sub=0 ;
add=x+y ; , b , add=0 , sub=0 ;
scanf ( " %d %d " , &a , &b ) ; printf ( " a=%d , b=%d \n " , a , b ) ; fun ( a , b ) ; printf ( " %d + %d =%d \n " , a , b , add ) ; printf ( " %d – %d =%d \n " , a , b , sub ) ; }
注意:在使用 & 运算符求变量的地址, 并赋给指针变量时,一定要确保所求地址 的变量数据类型与存放该变量地址的指针 变量基类型一致。
接上例,如执行 p=&x ; 语句,则是 绝对错误的。为什么?请读者想一想!
读者还记得在前面调用 scanf 函数时,
其函数调用格式中,输入数据所对应的各 变量名之前都必须加运算符 & ,这就是我 们所说的求地址运算符。scanf 函数把从终
例如:int k=1 , j =2 , *q1 , *q2 , *p ; float x=4.5 ; q1=&k ; q2=&j ;
以上第三条语句,是把变量k的地址赋 给了指针变量q1,使指针变量q1中存放了 变量k的地址,或称指针变量q1指向了变量 k。同理,以上第四条语句,是把变量j的 地址赋给了指针变量q2,使指针变量q2中 存放了变量j的地址,或称指针变量q2指向 了变量j。