·在众多高级语言当中,C语言又是作为底层的高级语言,学习C语言时有一个工具是永远都离不开的——指针
相信很多大学生或者初学者对于C语言的学习都是止步于这个指针了,它实在是太烧脑,太绕了。
那么首先我们先来回顾一下什么是指针:
简单来说,指针就是一个变量,它存储了一个内存地址。通过这个地址,我们可以访问并修改该地址上存储的数据。
那为什么要用指针呢?
从两个实际应用的角度来讲:
1、首先是在封装函数时,对于形参数组,它实际上并没有创建出临时空间存储传递进来的实参,举个例子:
#include <stdio.h> //要实现的功能为:将数组a中第n个元素,替换为data void change(int b[],int n,int data){ b[n-1]=data; } int main(){ int a[]={1,2,3,4,5,6,7,8,9}; change(a,4,8); //遍历数组 int i=0; while(a[i]){ printf("%d\t",a[i]); i++; } return 0; }
其实在上述代码当中,函数change()中并没有创建临时的数组b[]来帮助main()函数中的a[]数组去改变里面的元素。其实质是根据地址来操作里面的数据。
在函数中的数组可以根据地址来修改,但是传递的参数如果是一个整数实参又会怎么样呢?
#include <stdio.h> void changeA(int n){ puts("请输入改变后的数字:"); scanf("%d",&n); } int main(){ int a=10; changeA(a); printf("改变后数字为:%d",a); return 0; }
可以看到结果,main()函数中的变量a并没有发生改变:
有人会说,那只要给一个返回值就OK了呀,这样也能改变。那如果是要改变两个甚至多个变量那应该怎么办呢?返回值只有一个呀?
别急接下来我会给出解决方案:
#include <stdio.h> void changeA(int *n,int *m){ puts("请输入改变后的数字:"); scanf("%d%d",n,m); } int main(){ int a=10; int b=20; changeA(&a,&b); printf("改变后数字为:%d和%d",a,b); return 0; }
此时我们看到,哪怕是整数变量也可以根据“地址”来修改里面的数据了。
这就是指针的精髓所在,可以根据地址随心所欲的高效的去修改变量里的值。
2、第二个应用角度便是实际的开发啦,学习过计算机组成的同学都知道,有个东西叫做寄存器,它的位置是固定的,想要访问它就是要去根据地址进行操作,比如我可以定义一个变量的地址为:
int *p=000000000061FDF0;
那么此时我就可以根据指针变量p来随心所欲的访问这个地址了。
---------------------------------------------------------------------------------------------------
讲完了什么是指针,接下来就是今天的正文了:指针和二维数组
首先我们要清楚一个概念:
int a[]={1,2,3,4,5};
在上述语句中,int表示变量类型,a是“数组名”,{}内的数据是数组的元素;
a[0]=1,这个肯定能够理解,指的是具体的某一个元素。
但是在C语言中,有这样一个概念:
在C语言中,规定了数组名代表数组元素首地址
所以说,变量名a==&a[0],即a即表示数组名,又表示这个元素的首地址,同样也是元素'1'的地址所在。
接下来我们继续说二维数组!!!
其实二维数组从本质上来说,就是一个数组,只不过这个数组内的每一个元素都是“一维数组”。这有点像从属关系,也可以叫做“父子关系”。
对于二维数组:
int a[3][4]={{1,2,3,4},{3,4,5,6},{5,6,7,8}};
我们可以这样去理解:二维数组是爸爸、一维数组是儿子,儿子从属于爸爸,一维数组从属于二维数组(一维数组是二维数组的一个元素)。
∵数组名==地址
∴a表示二维数组的首地址
∵二维数组a[3][4]的第一个元素是:一维数组a[0]={1,2,3,4}
tips:注意这里的a[0]表示的是二维数组中的第一个元素
∴a[0]即表示这个“一维数组名”,也表示这个数组的“首地址”
∴
a[0]==&a[0][0]; a[1]==&a[1][0]; a[2]==&a[2][0];
思考?
a是谁的地址?
a是二维数组名,也是二维数组的地址(首地址)
a[0]又是什么?
a[0]是二维数组a[3][4]中首个元素,一维数组的数组名,又是首个一维数组的地址
*a是什么?
∵在这里‘*’表示取值运算符
又∵a表示父数组名,又表示父数组地址
∴‘*a’表示取父数组中首个元素的‘值’
∵地址a==地址a[0]==&a[0][0]
∴‘*a’取到的值就是一维数组a[0] //在这里千万不要搞混,a[0]是一维数组名,也是这个
一维子数组
∴*a==a[0]==a==&a[0][0]
*(a+0)又是什么?
∵a是父数组地址,(a+i)就是进行地址偏移(地址偏移就是指针变量的地址改变)
又∵*a==a[0]
∴*(a+0)==a[0]
*(a+i)==a[i]
∴*(a+i)就是二维数组(父数组)第i个子数组的首地址:&a[i][0]
以上是我对于二维数组的理解和综合,希望可以帮到大家,有不对的地方请大家斧正,提醒!!!