根据前面指针的学习,我们会发现,指针跟数组有些相似的地方。
这里我们首先引入一个知识点
C语言规定:数组名a是指针常量,它代表的是数组的首地址,即数组第一个元素a[0]的首地址。
#include<stdio.h> int main() { int a[5]={1,2,3,4,5}; printf("数组a的首地址为:%p\n", a);//这三个是等价的 printf("\n"); printf("数组a的首地址为:%p\n", &a); printf("\n"); printf("数组a的首地址为:%p\n", &a[0]); printf("\n"); return 0; }
a+i就是a[i]的地址,即a+i与&a[i]等价。数组元素a[i]的地址&a[i]称为a[i]的指针(因为地址就是指针)。)所以a+i又称为指向a[i]的指针,简称a+i指向a[i]。
这一段很抽象,我们画一张表格理解一下。
指针 | 地址 | 元素 |
a | 0x01 | a[0] |
a+1 | 0x02 | a[1] |
a+2 | 0x03 | a[2] |
a+3 | 0x04 | a[3] |
a+4 | 0x05 | a[4] |
#include<stdio.h> int main() { int a[5] = {1,2,3,4,5}; for (int i = 0; i < 5; i++)//这两个for循环是等价的 { printf("a[%d]的地址为:%p\n", i, &a[i]); } printf("\n"); for (int i = 0; i < 5; i++) { printf("a[%d]的地址为:%p\n", i, a+i); } return 0; }
那么既然数组有这种特性,我们该如何把指针与数组联系起来呢?
首先,我们将指针变量p指向数组a的首地址。此时a+i也就等于p+i,即&a[i]等价与p+i。
#include<stdio.h> int main() { int a[5] = {1,2,3,4,5}; int* p = a;//定义指针变量p指向数组a的首地址 for (int i=0; i < 5; i++)//与上述两个for循环等价 { printf("a[%d]的地址为:%p\n",i,p+i); } return 0; }
我们已经知道了地址,该如何输出值呢?
#include<stdio.h> int main() { int a[5] = { 1,2,3,4,5 }; int* p = a;//定义指针变量p指向数组a的首地址 for (int i = 0; i < 5; i++)//数组名下标,以下4种for循环都等价 { printf("a[%d]=%d\n", i, a[i]); } printf("\n"); for (int i = 0; i < 5; i++) { printf("a[%d]=%d\n", i, *(a + i));//数组名指针 } printf("\n"); for (int i = 0; i < 5; i++) { printf("a[%d]=%d\n", i, *(p+i));//指针变量指针 } printf("\n"); for (int i = 0; i < 5; i++) { printf("a[%d]=%d\n", i, p[i]);//指针变量下标 } return 0; }
总共有如上四种方法,注意观察一下时间,比比时间复杂度上谁更快哦!
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复