c语言中数组具有的特性是什么,关于C语言中数组的一些特性

C语言的数组是C语言中比较特殊的一种数据类型。这种数据类型由元素类型和元素个数共同决定。并且元素计数是从0开始到数字大小减去1。

数组名

数组名是数组的名字。在使用它的时候需要注意C语言中的规定。首先我们来看一维数组

#include

int main()

{

int num[10] = { 0 };

printf("%p\n", num);

printf("%p\n", (num + 1));

printf("%p\n", (&num + 1));

return 0;

}

先看运行结果。

096aaf1b23afa2c9b25803785b79cc69.png

结果表明num和&num在进行步进操作的时候完全不同。

00DDF7B8 ➖ 00DDF794 = 24(H) = 36(D)。

这里的int类型占据4个字节,也就是两者差了9步。因此可以得出结论:

num+1步进了1步;&num+1步进了10步。

num代表得是数组首元素地址;

&num是整个数组的地址。

下面我们接着分析二维数组的数组名。

#include

int main()

{

int num[10][10] = { 0 };

printf("%p\n", num);

printf("%p\n", (num + 1));

printf("%p\n", (&num) + 1);

return 0;

}

运行结果如下:

885c5febc58038f8553f04a55c151f2b.png

008FF608 ➖ 008FF5E0 = 28(H) = 40(D).

008FF770 ➖ 008FF608 = 168(H) = 360(D).

这时候,二维数组名和一维数组又表现得不一样了。

二维数组名num本身代表得是一个指针,只不过它是指向这样一个类型:int *[10],而是不是int * [10][10]类型。

下面是测试:

#include

int main()

{

int num[10][10] = { 0 };

int (*p)[10];//定义一个数组指针

p = num; //指向num数组

printf("%p\n", num);

printf("%p\n", (num + 1));

printf("%p\n", (&num + 1));

printf("%p\n", p);

printf("%p\n", (p + 1));

return 0;

}

测试结果如下:

00b0dbabcd6fe639aa132fac5a92357a.png

可以看到num这个数组名确实和p得表现确实一致。那么谁和&num表现得是一致得呢?我们接着测试。

#include

int main()

{

int num[10][10] = { 0 };

int (*p)[10];//定义一个数组指针

int(*p1)[10][10] = #

p = num;

printf("%p\n", num);

printf("%p\n", (num + 1));

printf("%p\n", (&num + 1));

printf("\n");

printf("%p\n", p);

printf("%p\n", (p + 1));

printf("%p\n", (p1 + 1));

return 0;

}

下面我们来看这个测试得结果:

e53606c1336b7a10dd8431c345ff03d0.png

可以看到,&num和p1得表现是一致得。这说明&num得实际是一个指向int * [10][10]得数组指针。

有了上面得结论,我们下面接着看数组作为函数参数得问题。

数组做函数参数

数组做函数参数传递不是数组本身,而是数组地址。这样能提高C语言得效率,并且能节省空间。一维数组做函数参数是非常简单得,如下所示。

#include

void fun(int* num)

{

num[3] = 333;

}

int main()

{

int num[10] = { 0 };

fun(num);

printf("%d\n", num[3]);

return 0;

}

一维数组,我们这么写没有任何问题,结果如下所示。

56014856b5626ead854ae1ded00de6ab.png

那么二维数组得时候,我们由上面得分析可以得知,我们应当这么写:

#include

void fun(int (*num) [10]) //二维数组做函数参数可以这样传递

{

num[3][3] = 333;

}

int main()

{

int num[10][10] = { 0 };

fun(num);

printf("%d\n", num[3][3]);

return 0;

}

结果如下:

73f47dbcae58e10d35efe4f75e8b7860.png

这样就是说二维数组做函数参数可以传递一个指向一维数组得指针;实际上多维数组全部都是这样退化的。例如下面的三维数组。

2501ea8ebb0f1e19514484660dba3103.png

本文同步分享在 博客“zy010101”(CSDN)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值