一、定义一个指针变量指向数组:
int *p = &a[0];
C语言中数组名代表数组中首元素的地址,因此还可以写成:
int *p = a;
二、指针增量和数组的关系
指针加1,就是让指针往下偏移一个单位,单位的大小由其数据类型决定。
int array[3]={1,2,3};
int *p;
p = array;
printf("元素的地址为:%p,值为%d",p,*(p));
printf("元素的地址为:%p,值为%d",p+1,*(p+1));
printf("元素的地址为:%p,值为%d",p+2,*(p+2));
例外一种写法:printf("%d",*p++); *p优先级更高,之后进行p++操作。在进行完这项操作后,如果下面要重新调用指针偏移,要注意将指针变量重新回到首元素:p = array[0];
输出结果:
0元素的地址为:000000000061FE0C,值为1
1元素的地址为:000000000061FE10,值为2
2元素的地址为:000000000061FE14,值为3
这里的p指针变量为int型,每次偏移内存大小为4个字节。
三、通过指针引用数组元素
1.取下标
2.指针法:
①偏移
②取内容
见怪不怪:
指针当做访问名
#include <stdio.h>
int main(){
int array[3]={1,2,3};
int *p;
p = array;
printf("%d",p[2]); //指针变量p当做数组名,对数组进行访问
return 0;
}
数组名访问偏移:printf("%d\n",*(array+1));
数组名和指针的区别:
指针变量可以自加如:p++,但是数组名不能自加
指针变量:保存地址的变量,保存的地址可改
常量指针:数组开拓的内存空间固定
printf("%d",*array++); //编译不通过,指针常量
sizeof 关键字表示占用的内存大小:
指针变量:无论什么类型都用8个字节表示
数组:元素个数x一个数据类型内存大小
printf("sizeof array is %d\n",sizeof(array));
printf("sizeof p is %d\n",sizeof(p));
结果:
sizeof array is 12
sizeof p is 8
3.取下标和指针法的效率对比:系统对数组变量进行访问时,指针的访问效率远远大于数组名的访问效率,但是只有指针正确访问时,才比下标访问更有效率。