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

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

数组名

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

#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是整个数组的地址。

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

#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]类型。

下面是测试:

#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表现得是一致得呢?我们接着测试。

#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语言得效率,并且能节省空间。一维数组做函数参数是非常简单得,如下所示。

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

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

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

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

结果如下:

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章