深入理解C语言中的二维数组和指针用法

目录:

  1. 二维数组概述
  2. 二维数组类型指针详解
  3. 一维数组类型指针详解
  4. 数组名的特殊性质
  5. 指针大小的确定
  6. &a 与 &a[0]的区别及演示
  7. 总结

1. 二维数组概述

二维数组是指数组中的每个元素又是一个数组,它们的特点是元素类型相同,但是值可以不同。例如:

int a[2][3] = {{3,6,2},{1,9,7}};

这是一个包含两个小数组的二维数组,其中第一个小数组的值为3、6、2,第二个小数组的值为1、9、7。

2. 二维数组类型指针详解

二维数组类型指针,指向的是整个二维数组的地址。例如:

int (*p)[2][3] = &a;

这里的(&a)是整个二维数组的地址,变量p是一个指向二维数组的指针。(*p)的用法与a相同,a[1][1]等价于(*p)[1][1]。可以通过p来访问整个二维数组的所有元素。

3. 一维数组类型指针详解

一维数组类型指针指的是数组中每个元素的地址,例如:

int(*p1)[3] = &a[0];

变量p1指向二维数组a的第一个小数组,a[0]也是一个数组,其大小为3,所以p1的类型是一个一维数组类型的指针。与二维数组类型指针类似,(*p1)的用法与a[0]相同,a[0][0]等价于(*p1)[0]。可以通过p1访问二维数组中的第一个小数组。

int(*p2)[3] = &a[1];

变量p2指向二维数组a的第二个小数组,同样,p2的类型是一个一维数组类型的指针。与二维数组类型指针类似,(*p2)的用法与a[1]相同,a[1][1]等价于(*p2)[1]。可以通过p2访问二维数组中的第二个小数组。

4. 数组名的特殊性质

在C语言中,数组名是一个指向其第一个元素的指针。对于二维数组aa的值等于&a[0]。因此,可以使用以下方法来初始化一个指向二维数组的指针:

int(*p)[3] = a;

变量p被初始化为指向二维数组a的第一个小数组,这里和一维数组类型指针的写法相同。与一维数组类型指针相似,p和数组名a的用法也一模一样。例如,a[0][1]等同于p[0][1]

5. 指针大小的确定

在C语言中,所有的指针(无论是什么类型)都有固定的大小,在32位编译环境下是4字节,在64位编译环境下是8字节。这是因为指针就是一个内存地址,而内存地址的大小也是固定的,因此指针的大小也是固定的。

6. &a 与 &a[0]的区别及演示

&a&a[0]虽然都表示二维数组a的地址,但是它们的类型却不一样。前者的类型是一个指向包含两个小数组的二维数组的指针,而后者的类型是一个指向第一个小数组的指针。

对于&a,加1会加上整个二维数组的大小,而对于&a[0],加1会加上一个小数组的大小。例如:

printf("%p\n", &a);
printf("%p\n", &a[0]);
printf("%p\n", &a[1]);
printf("%p\n", &a[0][0]);

输出结果为:

0x7ffee1a9aca0
0x7ffee1a9aca0
0x7ffee1a9aca6
0x7ffee1a9aca0

这里可以看到,&a&a[0]的数值是一样的,但是类型不同。加1时,&a加整个数组的大小,&a[0]加一个小数组的大小。

7. 总结

本文详细介绍了二维数组、二维数组类型指针、一维数组类型指针、数组名的特殊性质、指针大小和&a&a[0]的区别和演示。希望对读者有所帮助。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南侠客(上海)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值