指针偏移直接用运算符 “+”,后面写上偏移量,不能用数组下标的方式,数组下标只是取值。
例如:
int main()
{
int a[10] = {2,8,7,3,5,6,4,1,9,10}; //此时,数组名 a 可以看做是该数组的指针常量
/* 取地址 */
printf("a+1 的地址为: %x\n",a+1); //此时指针 a 向右偏移了1 ,指向了该数组的第二个元素 ‘8’ (数组初始化后,指针默认指向第一个元素)
//打印结果为 a+1 所指元素的地址,是一个 8 字节(64位平台)大小的十六进制数,32位平台则是 4 字节大小
printf("a+1 的地址为:%x\n", &a[1]); //同理,用运算符 ‘&’ 可以得到 a+1 的地址
int *p = a+1; //这时,创建一个指针变量并将 a+1 的值赋给它
printf("a+1 的地址为:%x\n", p); //这样也能得到 a+1 的地址
printf("p 的地址为:%x\n", &p); //同理,这样也能得到指针 p 的地址
//指针变量 p 存放的是 a+1 的地址,同时,它自己也有地址
int **s = &p; //这时,我们再创建一个二级指针 s ,用来存放指针 p 的地址
printf("p 的地址为:%x\n", s); //这样也能得到指针 p 的地址
/* 取值 */
printf("a+1 == %d\n",*(a+1));
// *(a+1) 是对 a+1 这个地址指向的元素取值,用运算符 ‘*’
//所以,打印结果为:a+1 == 8
printf("a+1 == %x\n", **s); // a+1 指向元素 8 ,指针 p 指向 a+1 ,指针 s 指向 p
// 所以,打印结果为:a+1 == 8
return 0;
}
//从上到下,所有打印结果为:
/**
a+1 的地址为: db79f75c
a+1 的地址为:db79f75c
a+1 的地址为:db79f75c
p 的地址为:db79f798
p 的地址为:db79f798
a+1 == 8
a+1 == 8
*/