4.指针与一维数组
我们知道一个数组的元素在内存中是连续存放的,数组第一个元素的地址称为数组的首地址。在C语言中,数组名就是该数组的首地址。
1 | int a[4869],*p; |
以上面的为例,语句“ p=a; ”和语句“ p=&a[0]; ”是等价的,都表示指针变量p指向数组a的首地址。数组首地址的值在C语言中是一个地址常量,无法改变。因此,语句“ a=p; ”或者语句“ a++; ”都是非法的。
如果数组的首地址是a,且指针变量p指向该数组的首地址,即“ p=a; ”,则C语言中还规定数组的第i个元素a[i]的地址是a+i,其等价于p+i。如:
1 | int a[5]={0,1,2,3,4},*p=a; //p指向整型数组a的首地址。 |
C语言中的下标运算符“ [] ”可以构成表达式,假设p为指针变量,i为整型表达式,则可以把p[i]看成是表达式,首先按p+i计算地址,然后存取该地址单元中的值。
若定义了一维数组a和指针变量p,且p=a。则有等价关系:a[i]<=>p[i]<=>*(a+i)<=>*(p+i)。
注:以上i为整型表达式。
5.指针的算数运算
5-1.移动指针
移动指针是指把指针变量加上或减去一个整数,或通过赋值运算,使指针变量指向相邻的存储单元。因此,只有当指针变量指向一块连续的存储单元时,指针的移动才有意义。例如:
1 | type *p,*q; //此处的type指代指针变量所指向变量的数据类型。 |
假定m和n为正整数,则系统将自动计算出:
p指针向高地址方向位移的字节数==sizeof(type)*n;
q指针向低地址方向位移的字节数==sizeof(type)*m;
指针每加减1一次所位移的字节数等于其所指的数据类型的大小,而不是简单地把值加减1。因此p++能够提高程序的运行效率。
5-2.指针相减
指向同一块连续存储单元(通常为数组)的两个指针变量可以 进行相减运算。假若p与q指向同一数组,则p-q的值等于p所指对象与q所指对象之间的元素个数。若p>q则取正;若p<q则取负。如:
1 |
|
输出结果如下图:
指针变量除了可以“移动”和“相减”外不能进行其他算术运算。
6.指针的比较
指向同一块连续存储单元的两个指针变量可以进行关系运算。
假设指针p、q指向同一数组,则可以用关系运算符“<”、“>”、“<=”、“>=”、“==”、“!=”进行关系运算。若p==q为真,则表示p与q指向数组的同一元素;若p指向高地址元素,q指向低地址元素,则p>q的值为真。
任何指针变量都可以与空指针NULL相比较。