C语言之数组基础
数组的概念:
数组是相同类型的变量的有序集合
int a[5];
数组的大小:
数组元素的个数可以显示或隐式指定
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;
}
运行结果
将数组中的每个元素初始化为0:
int a[5 ] = {0};
数组地址与数组名:
数组名代表数组首元素的地址
数组的地址需要用取地址符&才能得到
数组首元素的地址值与数组的地址值相同
数组首元素的地址与数组的地址是两个不同的概念
区别举例:
你家所在的楼房和你家的GPS地址是相同的,但意义相同吗?
楼房代表的是整个楼,而你家只是你家的。
图示:
数组名的盲点:
数组名可以看做一个常量指针(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;
}
运行结果:
实例分析:
定义为指针,声明为数组
数组和指针并不相同 (前面我们说过:数组名可以看做一个常量指针(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";
编译器处理指针与数组不同:
指针:经过一次寻址
数组:直接打印连续空间,没有寻址
数组小结:
数组是一片连续的内存空间
数组的地址和数组首元素的地址意义不同
数组名在大多数情况下被当成常量指针处理
数组名其实并不是指针,在外部声明时不能混淆