【指针的移动】
Q:指针变量如何指向一维数组的其他元素呢?
A:
[操作1] p=&a[3]; // 假设指针变量p和数组a已经全部定义和初始化。
[操作2] 如果指针变量p 已经指向一维数组的第一个元素,那么p+1 就表示指向该数组的第二个元素。p+1指向的就是下一个元素。
【程序代码1 知识点】
如果p指向的是第一个元素的地址,那么*p表示的就是第一个元素的内容。
同理,p+i 表示的是第 i+1个元素的地址,那么*(p+i) 表示第 i+1个元素的内容。
就是说p+i 就是指向元素a[i]的指针,*(p+i) 就等价于a[i]。
括号不能省略,* 的优先级比+的优先级更高。
* (p+1) 和 *p+1 不是等价的,*p+1相当于 (*p)+1。
【程序代码2 知识点】
数组名表示数组的首地址,a[i]表示的是数组第i个元素。
如果指针变量也指向这个首地址,可以用p[i]表示数组的第i个元素。
p[i] 和 *(p+i) 是等价的===“指向数组的”指针变量也可以写成“带下标”的形式。
【程序代码3 知识点】
数组a表示的是数组的首地址,元素a[i]的地址也可以用a+i表示。
如果指针变量p也指向数组a的首地址,那么 p+i 和 a+i是等价的。
只要是地址,都可以用 *地址 表示该地址所指向的内存单元中的数据。
而且也只有地址前面才需要加*,才能表示具体的数据。
在执行程序的时候,数组先是计算地址,然后转化成指针。
直接使用 *(a+i),执行速度会更快。
【程序代码1】
【指针的移动】三种不同的写法
1 p =&a[3];
指针p,指向数组a第4个元素的地址,所以输出*p的结果为44。
2 q = a; q = q+3;
指针q指向数组a的起始地址,q+3表示数组的第4个元素。
3 r = a; 输出*(r+3),表示第4个元素。
*q+i相当于 (*q)+i;


#include <stdio.h>
int main(void)
{
int a[] = {11, 22, 33, 44, 55, 66};
int *p, *q, *r;
p =&a[3]; //第一种写法
printf("*p = %d\n", *p);
q = a; //第二种写法
q = q+3;
printf("*q = %d\n", *q);
r = a; //第三种写法
printf("*(r+3) = %d\n", *(r+3));
return 0;
}
【程序代码2】
数组名表示数组的首地址,a[i]表示的是数组第i个元素。
如果指针变量也指向这个首地址,可以用p[i]表示数组的第i个元素。
p[i]和*(p+i)是等价的===“指向数组的”指针变量也可以写成“带下标”的形式。


#include <stdio.h>
int main(void)
{
int a[] = {11, 22, 33, 44, 55, 66};
int *p =a;
printf("p[0] = %d\n", p[0]);
printf("p[1] = %d\n", p[1]);
printf("p[2] = %d\n", p[2]);
printf("p[3] = %d\n", p[3]);
printf("p[4] = %d\n", p[4]);
printf("p[5] = %d\n", p[5]);
return 0;
}
【程序代码3】
数组a表示的是数组的首地址,元素a[i]的地址也可以用a+i表示。
如果指针变量p也指向数组a的首地址,那么 p+i 和 a+i是等价的。
只要是地址,都可以用 *地址 表示该地址所指向的内存单元中的数据。
而且也只有地址前面才需要加*,才能表示具体的数据。
在执行程序的时候,数组先是计算地址,然后转化成指针。
直接使用 *(a+i),执行速度会更快。


#include <stdio.h>
int main(void)
{
int a[] = {123, 456, 789, 888, 666, 999};
int *p = a;
printf("*(p+3) = %d, *(a+3) = %d\n", *(p+3), *(a+3));
return 0;
}
609

被折叠的 条评论
为什么被折叠?



