根据前面指针的学习,我们会发现,指针跟数组有些相似的地方。
这里我们首先引入一个知识点
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分
2 人评分
C语言程序设计教程(第三版)课后习题6.9 (C语言代码)浏览:715 |
C语言训练-排序问题<2> (C++代码)(sort函数)浏览:1591 |
C语言程序设计教程(第三版)课后习题11.5 (C语言代码)浏览:974 |
C语言训练-计算一个整数N的阶乘 (C语言代码)浏览:939 |
C语言程序设计教程(第三版)课后习题5.6 (C语言代码)浏览:902 |
剪刀石头布 (C语言代码)浏览:1443 |
10月月赛题解浏览:536 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:582 |
1063题 初学者,求帮忙看下,不知道哪错了浏览:232 |
C语言程序设计教程(第三版)课后习题7.4 (C++代码)浏览:557 |