1.用指针引用数组中各元素
先定义一个一维数组a
int a[5]={1,2,3,4,5};
再定义一个指向该数组首元素的指针变量p
int *p=a; // 也可以写为 int *p=&a[0];
然后用for循环遍历数组并输出
for (i=0;i<5;++i)//数组的元素个数作为循环变量
{
printf("%d",p[i]); // p[i] 等价于 *(p+i) 等价于 a[i] 等价于*(a+i)
}
/*也可以写成下面的形式*/
for ( ;p<a+5;++p)//数组各元素的地址作为循环变量
{
printf("%d",*p);
}
完整代码如下
/*用指针访问数组*/
#include<stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
int *p=a;//等价于&a[0]
int i;
for (i=0;i<5;++i)//数组元素个数作为循环变量
{
printf("%d ",*(p+i));//这里的 *(p+i)等价于 *(a+i)等价于a[i]等价于p[i]
}
/*上面的for循环也可写成下面这样*/
// for (;p<a+5;++p)//数组地址作为循环变量
// {
// printf("%d ",*p);
// }
return 0;
}
2.指针变量的自增和自减运算
指针变量自增 p++ 或++p是让指针指向下一个元素的地址。同理,指针变量自减 p-- 或--p是让指针指向上一个元素的地址。
指针运算符 “ * ” 和自增自减运算符 “ ++ ” “ -- ” 的优先级相同,且结合方向是自右向左,所以
*p++ 即为 *(p++) ,*++p 即为 *(++p)。在实际编程中,为了提高程序的可读性,往往要加上括号。
注意:数组名a是首元素的地址,是个常量,所以不能进行自增自减运算。只有变量可以进行自增自减运算。
3.指针变量所占字节数
在32位机中,不管是什么基类型,系统给指针变量分配的空间都是4字节。
在64位机中,不管是什么基类型,系统给指针变量分配的空间都是8字节
以64位机为例,64位机总共有64根地址总线,每根地址总线有0和1,或者说是高电压和低电压 这两种状态。内存单元中的每个地址都由这64根地址总线以不同的状态组合而成的。所以64位是8字节,指针变量占8字节,就正好能存储下所有内存单元里的地址。