1、数组类型和多维数组本质
1.1 数组概念
从元素类型的概念,数组是相同类型的变量的有序集合。
从内存的角度:是连续的一大片空间。
1.2 数组初始化
数组元素的个数可以显示或隐式地指定;
分析数组初始化{0}和memset比较;
指定长度:int a[10] = {1, 2};
不指定长度:int b[] = {1, 2};
全部置为0初始化:int c[20] = {0}; // 编译的时候就已经确定所有的值为0.
全部置为0赋值:memset(a, 0, sizeof(a)); 显式地重置内存块。
数组名的技术盲点:
1、对于一维数组,c语言规定,数组首元素的地址和数组地址是两个不同的概念。
数组名(例: a)是数组首元素的地址(是常量),a+1步长为1*sizeof(int);对数组名取地址,是数组地址,&a+1步长是整个一维数组的大小10*sizeof(int)。
2、表达数组数据类型?a[10] (c++里,new int[10])
数据类型分基础,非基础两种。数组数据类型是非基础数据类型。c语言中的数组有自己特定的类型,由元素的类型和数组大小共同决定。
例如 int array[5] 的类型为 int [5]。确定了一个连续的内存块,大小5*4=20个字节,分为5个元素,每个元素大小4个字节,按照int型解释。
如何定义数组数据类型?类型的本质是固定大小内存块的别名
typedef int(MYARR)[5][5] //用括号括起来。由于括号和中括号优先级相同,但结合方向都是自左向右,因此谁写在左边谁的“优先级”就高。小括号中的名字即这种数组类型的类型名,可以用抽象出的MYARR数据类型去定义其他的数组。
数据类型不分配内存空间。只有定义变量时才分配空间。
MYARR array; //相当于int array[5][5];
代码:
#include <stdio.h>
int main()
{
typedef int (MyArrayType)[5];
MyArrayType array;
int i=0;
for(i=0;i<5;i++)
{
array[i]=i;
}
for(i=0;i<5;i++)
{
printf("array[%d]:%d\n", i, array[i]);
}
printf("array:%d, array+1:%d\n", array, array+1); // 数组首元素地址
printf("&array:%d, &array+1:%d\n", &array, &array+1); // 数组地址
return 0;
}