C语言之数组基础

数组的概念:

数组是相同类型的变量的有序集合

int a[5];

C语言之数组基础

数组的大小:

数组元素的个数可以显示或隐式指定

int a[5] = {1,2}; //显示指定

int b[] = {1,2}; //隐示指定

#include <stdio.h>
#include <malloc.h>

int main()
{
	int a[5]={1,2}; //数组a中的元素值为{1,2,0,0,0} 
				   //int a[5]; 不初始化时,数组a中的元素为随机值.
	int b[] = {1,2};
	int i;

	printf("%d %d\n",sizeof(a),sizeof(a)/sizeof(*a) ); //打印:数组的内存大小 数组元素的个数
	printf("%d %d\n",sizeof(b),sizeof(b)/sizeof(*b) );

	for(i = 0; i<5; i++)
	{
		printf("%d\n",a[i]);
	}
	
	return 0;
}

运行结果

C语言之数组基础

将数组中的每个元素初始化为0:

int a[5 ] = {0};

数组地址与数组名:

数组名代表数组首元素的地址

数组的地址需要用取地址符&才能得到

数组首元素的地址值与数组的地址值相同

数组首元素的地址与数组的地址是两个不同的概念

区别举例:

你家所在的楼房和你家的GPS地址是相同的,但意义相同吗?

楼房代表的是整个楼,而你家只是你家的。

图示:

C语言之数组基础

数组名的盲点:

数组名可以看做一个常量指针(int* const p;)

数组名“指向”的是内存中数组首元素的起始位置

在表达式中数组明只能作为右值使用

只有在下列场合中数组名不能看做常量指针
数组名作为sizeof操作符的参数
数组名作为&运算符的参数(当然是指数组的地址喽!)

a,b两个数组不能用a=b进行赋值:

#include <stdio.h>
#include <malloc.h>

int main()
{
	int a[5]={1,2};
	int b[] = {1,2};

	printf("%0x %0x\n",a,&a);
	printf("%0x %0x\n",b,&b);

	a = b; //error
	
	return 0;
}

运行结果:

C语言之数组基础

实例分析:

定义为指针,声明为数组

数组和指针并不相同 (前面我们说过:数组名可以看做一个常量指针(int* const p;)

test.c

#include <stdio.h>

extern char p[];

int main()
{
	printf("%s\n",p); #打印的是:cc指针的值

	return 0;
}

another.c

char* p = "Hello,World";

C语言之数组基础
编译器处理指针与数组不同:

​ 指针:经过一次寻址

​ 数组:直接打印连续空间,没有寻址

数组小结:

数组是一片连续的内存空间
数组的地址和数组首元素的地址意义不同
数组名在大多数情况下被当成常量指针处理
数组名其实并不是指针,在外部声明时不能混淆