一 定义一个指针变量指向数组
1.途径一:指向数组首元素的地址
- 代码示例:
#include <stdio.h>
int main()
{int arr[3]={2,4,5};int *p;p=&arr[0];printf("该数组的首元素是:%d",*p);return 0;
}
- 成果展示:
- 报错与总结:
- 给指针变量赋值时,未在数组首元素前输入取地址符
- 给指针变量赋值时,未在数组首元素前输入取地址符
2.途径二:数组名代表数组首元素的地址,因此可直接指向数组名
- 代码示例:
#include <stdio.h>
int main()
{int arr[3]={55,4,5};int *p;p=arr;printf("该数组的首元素是:%d",*p);return 0;
}
- 成果展示:
- 报错与总结:无
二 指针偏移遍历数组
- 代码示例:
#include <stdio.h>
int main()
{int arr[3]={2,4,5};int *p;p=&arr[0];int len;len=sizeof(arr)/sizeof(arr[0]);int i;for(i=0;i<len;i++){printf("第%d个元素是:%d\n",i+1,*(p+i));}return 0;
}
- 成果展示:
-
报错与总结:无
-
指针遍历数组与下标遍历数组的优缺点
- 指针:
- 优:访问效率更高,占用系统资源更少
- 缺:相较于下标法,程序可读性较弱
- 下标:
- 优:可读性强,更容易理解
- 缺:占用系统资源更大
- 指针:
三 指针偏移的补充
若是采用指针自加偏移,第二次以上遍历数组时,指针变量记得回到首地址,否则会越界
-
没有回到首地址:
- 代码示例:
#include <stdio.h> int main() {int arr[3]={2,4,5};int *p;p=&arr[0];int len;len=sizeof(arr)/sizeof(arr[0]);int i;puts("第一次遍历:");for(i=0;i<len;i++){printf("第%d个元素是:%d\n",i+1,*p++);}puts("\n第二次遍历:");for(i=0;i<len;i++){printf("第%d个元素是:%d\n",i+1,*p++);}return 0; }
- 成果展示:
- 报错与总结:无
-
回到首地址:
- 代码示例:
#include <stdio.h> int main() {int arr[3]={2,4,5};int *p;p=&arr[0];int len;len=sizeof(arr)/sizeof(arr[0]);int i;puts("第一次遍历:");for(i=0;i<len;i++){printf("第%d个元素是:%d\n",i+1,*p++);}p=&arr[0]; //我们在这里让指针变量回到首地址puts("\n第二次遍历:");for(i=0;i<len;i++){printf("第%d个元素是:%d\n",i+1,*p++);}return 0; }
- 成果展示:
- 报错与总结:无
四 指针与数组名见怪不怪的用法
- 指针当做数组名,下标法访问
- 代码示例:
#include <stdio.h>
int main()
{int arr[3]={26,43,67};int *p;p=arr;int len;len=sizeof(arr)/sizeof(arr[0]);int i;for(i=0;i<len;i++){printf("第%d个元素是:%d\n",i+1,p[i]);}return 0;
}
- 成果展示:
- 报错与总结:忘记给指针变量赋值,导致出现随机值
2.数组名拿来加:数组名当做指针用,但要注意数组名是一个常量指针,不可自加
- 代码示例:
#include <stdio.h>
int main()
{int arr[3]={26,43,67};int len;len=sizeof(arr)/sizeof(arr[0]);int i;for(i=0;i<len;i++){printf("第%d个元素是:%d\n",i+1,*(arr+i)); //注意:不可以:*arr++}return 0;
}
- 成果展示:
- 报错与总结:无