前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于C语言中数组的一些特性

关于C语言中数组的一些特性

作者头像
zy010101
发布2020-03-31 15:48:55
1.2K0
发布2020-03-31 15:48:55
举报
文章被收录于专栏:程序员程序员

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

数组名

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

代码语言:javascript
复制
#include <stdio.h>

int main()
{
	int num[10] = { 0 };

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

	return 0;
}

先看运行结果。

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

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

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

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

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

&num是整个数组的地址。

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

代码语言:javascript
复制
#include <stdio.h>

int main()
{
	int num[10][10] = { 0 };

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

	return 0;
}

运行结果如下:

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

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

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

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

下面是测试:

代码语言:javascript
复制
#include <stdio.h>

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;
}

测试结果如下:

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

代码语言:javascript
复制
#include <stdio.h>

int main()
{
	int num[10][10] = { 0 };
	int (*p)[10];		//定义一个数组指针
	int(*p1)[10][10] = &num;    
	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;
}

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

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

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

数组做函数参数

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

代码语言:javascript
复制
#include <stdio.h>

void fun(int* num)
{
	num[3] = 333;
}

int main()
{
	int num[10] = { 0 };

	fun(num);
	printf("%d\n", num[3]);
	return 0;
}

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

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

代码语言:javascript
复制
#include <stdio.h>

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;
}

结果如下:

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数组名
  • 数组做函数参数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档