根据前面指针的学习,我们会发现,指针跟数组有些相似的地方。
这里我们首先引入一个知识点
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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复