- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
注意:变量名前的星号“*”不可省略, 若省略了星号“*”说明符,就变成了普通 整型变量。
int是数据类型名,在这里,说明了pi 和pj是两个指向整型(int类型)变量的指 针,也就是说变量pi和pj中只能存放int类 型变量的地址,这时我们称int是指针变量 pi和pj的基类型。又如:
double *pd ;
以上是定义了一个指向指针的指针变 量p,该指针变量p只能存放基类型为int类 型的指针变量的地址。又如:
int *pi , **p , k ; 以上语句是在同一语句中,同时定义 了指针变量pi、指向指针的指针变量p和变 量k,这是允许的。
7.2.2 指针变量的基类型的作用
任何一个指针变量都是用于存放它所 指向变量的地址,只要能存放地址就可以 了,为何还要区别不同的基类型呢?
图7-2 指针和指针所指向的对象
所以根据指针变量p中存放的“地址”, 只能寻找到变量a第1个字节的存储空间, 如果只提取变量a所占存储空间第1个字节 的数据,显而易见不是int类型变量a的原 值,因为变量a的原值是通过2个Baidu Nhomakorabea节来存 储的数据。此时我们可以通过指针变量p的 基类型解决问题,知道了变量a的第1个字 节的地址,再根据指针变量p的基类型为 int类型,系统就将从变量a的第1个字节所 在的地址开始,连续提取2个字节中的数据, 此时的数据就是int类型变量a的原值。
中国地图行政区划矢量图
第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函数中。
char *s1 , *s2 ;
在这里定义了三个指针变量pd、s1和 s2,其中指针变量pd的基类型为double类 型,在指针变量pd中,只能存放double类 型变量的地址,指针变量s1和s2的基类型 为char类型,在指针变量s1和s2中只能存 放char类型变量的地址。又如:
int **p ;
7.2 指针变量的定义和指 针变量的基类型
7.2.1 指针变量的定义和指针
变量的基类型
定义指针变量的一般形式如下: 类型名 *指针变量名1,*指针变量名
2,……;
例如:int *pi , *pj ;
以上定义语句中,pi和pj都是用户标 识符,表示具体的变量名,现在每个变量 名前加一星号“*”说明符,用来说明所定 义的变量是指针变量。
例如: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。
{ int add=0 , sub=0 ;
add=x+y ;
sub=x–y ;
}
main ( ) { int a , 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 ) ; }
此,定义什么样的基类型指针变量,该指针变量
只能存放什么样类型变量的地址,两者必须一致, 否则就可能出现了张冠李戴的错误现象。
7.3 给指针变量赋值
7.3.1 使指针指向一个对象
1.通过求地址运算符(&)把
一个变量的地址赋给指针变量
“&”是求地址运算符,该运算符为 单目运算符,用于求变量的地址,且该变 量必须为内存变量。
注意:在使用 & 运算符求变量的地址, 并赋给指针变量时,一定要确保所求地址 的变量数据类型与存放该变量地址的指针 变量基类型一致。
接上例,如执行 p=&x ; 语句,则是 绝对错误的。为什么?请读者想一想!
读者还记得在前面调用 scanf 函数时,
其函数调用格式中,输入数据所对应的各 变量名之前都必须加运算符 & ,这就是我 们所说的求地址运算符。scanf 函数把从终
其原理是:不同的数据类型变量,C 语言系统为它们开辟的存储空间的字节数 是不同的,
int类型的数据存储空间是2个字节, float类型的数据存储空间是4个字节,……,
系统表示每一个存储空间的地址时,是取 该存储空间的第1个字节的地址作为该变量 存储空间的地址。那么当一个基类型为int 类型的指针变量p指向了一个int类型的变 量a时,是将该变量a所占的2个字节的存储 空间中的第1个字节存储空间的“地址”存 入指针变量p中,如图7-2(b)所示。
同理,基类型为float类型的指针变量,根据 指针变量中存放float类型变量的地址值,可以寻 找到所需存储空间中的第1个字节所在位置,然 后再根据基类型为float类型,连续地提取4个字 节中的数据,作为被访问的数据,这才是float类 型变量中存放的真实数据。由此,我们可以看到
指针变量在定义时,其基类型是何等的重要。因