一、变量的地址和指针
变量的地址:计算机的内存是以字节为单位的一片连续的存储空间,每一个字节都有一个编号,这个编号就是该内存的地址,并
且这些编号是连续的。而一个变量实质上代表了“内存中的某个存储单元”,而这些存储单元的编号就是该变量的地 址。
指针:指针是用于存放变量的地址,用于存放变量地址的变量称为“指针变量”。
二、指针变量的定义和指针变量的基类型
1.定义指针变量的一般形式如下:
类型名 *指针变量名1; *指针变量名2,...........;
例如:
int *p,*q;
注意:每个变量前的星号是一个说明符,用来说明该变量是指针变量。变量前的星号不可省略,若省略了星号说明符,就变成了
将p和q定义为整形变量。
2.指针变量的基类型:在这里主要说明一下为什么指针必须区分基类型。一个指针变量中存放的是一个存储单元的地址。这里“一 个存储单元”中的“一”所代表的字节数是不同的:对short int类型整数而言,它代表2个字节;对int类型而 言,它
代表4个字节,这就是基类型的不同含义。在涉及指针的移动,也就是要对地址进行增减运算,这时 指针移动的最小单位是一个储存单元,而不是1个字节。因此对于基类型不同的指针变量,其内容增1、减1 所“跨越”
的字节数不同,因此,基类型不同的指针变量不能混合使用。
三、给指针变量赋值
1.通过求地址运算符(&)获取地址值
int k=1, *q, *p;
则赋值语句:
q=&k;
说明:求地址运算符&只能应用于变量和数组元素,不可以用于表达式、常量。
2.通过指针变量获取地址值
i
nt k=1, *q, *p;
则赋值语句:
q=&k;
p=q;
这样指针变量p、q都指向了变量k。
四、对指针变量的操作
1.通过指针来引用一个存储单元
C语言提供了间址运算符“ * ”,当指针变量中存放了一个确切的地址时,就可以用“ * ”通过指针来引用该地址的存储单元。
int *p, i=10, j;
p=&i; /* p通过地址运算符&获得i的地址 */
j=*p; /* 指针变量p存储的是i的地址,*p等价于i,即将i的值赋给j (j=i)*/
由于“ * "操作的的对象是一个确切的地址值,所以j=*p;也可以表示为:
j=*(&i);
扩展:
int * *p, *s, k=20;
s=&k; /* *s代表存储单元k */
p=&s; /* *p代表存储单元s */
因此 * *p也代表存储单元k。
2.移动指针
移动指针就是对指针变量加上或减去一个整数,或通过赋值运算,使指针变量指向相邻的存储单元。因此,只有当指针指向一串连续的存储
单元时,指针的移动才有意义。
例:
a[0] a[1] a[2] a[3] a[4]
11 | 22 | 33 | 44 | 55 |
a[0] a[1] a[2] a[3] a[4]
11 | 22 | 33 | 44 | 55 |
q = p+2; /*如上第一个图所示,使指针q指向存储单元a[2] */
q++; /* 向高地址移动指针q,使指针q指向存储单元a[3] */
q++; /* 向高地址移动指针q,使指针q指向存储单元a[4] */
q--; /* 向低地址移动指针q,使指针q指向存储单元a[3] */
(指针可以进行比较,通常两个或多个指针指向同一目标时比较才有意义。