马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
指针3
指针与指针的运算
C指针算术运算的第2种形式是:
指针——指针
要注意,指针与指针之间的算术运算没有加运算,只有减运算。并且,只要当两个指针都指向同一个数组中的元素时,才允许将一个指针减去另一个指针。
两个指针相减的结果的类型是ptrdiff_t,它是一种有符号整数类型。减法运算的值是两个指针在内存中的距离(以数组元素的长度为单位,而不是以字节为单位),因为减法运算的结果将除以数组元素类型的长度。
例如,如果p1指向array[i]而p2指向array[i],那么p2-p1的值就是j-i的值。
如果两个指针所指向的不是同一个数组中的元素,那么它们之间相减的结果是未定义的。就像如果把两个位于不同街道的房子的门牌号码相减不可能获得这两所房子间的房子数一样。程序员无法知道两个数组在内存中的相对位置,如果不知道这一点,两个指针之间的距离就毫无意义。
运算符 & 和 *
如果指针的值是某个变量的地址,通过指针就能间接访问那个变量,这些操作由取址运算符 "&" 和间接访问运算符 "*" 完成。
单目运算符 "&" 用于给出变量的地址。例如:
int *p, a = 3;
p = &a;
将整型变量a的地址赋给指针p,使指针p指向变量a。也就是说,用运算符 "&" 去变量a的地址,并将这个地址值作为指针p的值,使指针p指向变量。
注意指针的类型和它所指向变量的类型必须相同。
例题:取地址运算和间接访问示例
#include<stdio.h>
int main(void)
{
int a = 3, *p; //定义整型变量a和整型指针p
p = &a; //把变量a的地址赋给指针p,即p指向a
printf("a = %d, *p = %d\n", a, *p); //输出变量a的值和指针p所指向变量的值
*p = 10; //对指针p所指向的变量赋值,相当于对变量a赋值
printf("a = %d, *p = %d\n", a, *p);
printf("Enter a:");
scanf("%d",&a);
printf("a = %d, *p = %d\n", a, *p);
(*p)++;
printf("a = %d, *p = %d\n", a, *p);
return 0;
}
例题分析:
第4行的"int a = 3, *p"和其后出现的*p,尽管形式是相同的,但两者的含义完全不同。的4行定义了指针变量,p是变量名,*表示其后的变量是指针;
而后面出现的*p代表指针p所指向的变量。本例中,由于p指向变量a,因此,*p和a的值一样。
再如表达式*p = *p + 1、++*p和(*p)++,分别将指针p所指向变量的值加1。而表达式*p++等价于*(p++),先取*p的值作为表达式的值,再将指针p的值加1,运算后,p不再指向变量a。
同样,在下面这几条语句中:
int a = 1, x, *p;
p = &a;
x = *p++;
指针p向指向a,其后的语句x = *p++,将p指向的变量a的值赋给变量x,然后修改指针的值,使得指针p不再指向变量a。
|