C语言:二维数组和指针

·在众多高级语言当中,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]

以上是我对于二维数组的理解和综合,希望可以帮到大家,有不对的地方请大家斧正,提醒!!!

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值