从内存角度,是一片连续的内存空间
数组初始化:
//在编译时明确指定全部元素为
int a[10] = {0};//在程序运行时,重置内存块为0
memset(a,0,sizeof(a));1234
数组元素个数在初始化的时候可以明确指出也可以根据初始化列表元素个数确定。
数据类型:固定大小内存块的别名
指针类型:依赖于指针所指向的内存空间的大小
C语言中的数组有自己特定的类型:由元素类型和数组长度决定
例:int array[5]的类型为int [5]
可以重命名数组类型,并用新的数组类型名命名数组变量,使用typedef关键字进行重命名
typedef int (MYINT5)[5];//MYINT5表示一个含有5个元素的int类型的数组 MYINT5 array;//相当于int array[5];123
数组名的技术盲点:
数组首元素的地址和数组地址是两个不同的概念
数组名代表数组首元素的地址,它是个常量
变量本质是内存空间的别名,一定义数组,就分配内存,内存就固定了。所以数组名起名以后就不能被修改了。
数组首元素的地址和数组的地址值相等,但只是值相等而已
int a[10];
printf("得到整个数组的地址a: %d \n", &a);
printf("数组的首元素的地址a: %d \n", a);
数组指针类型
直接定义数组指针变量
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ARRAY_SIZE 5
int main(void)
{
int i = 0;
int (*p_array)[ARRAY_SIZE] = NULL;//告诉编译器 给我分配一个指针变量
//直接定义一个数组指针,相当于int (*p_myArray)[5];
int array[ARRAY_SIZE]={0};
p_array = &array;//将指针变量指向数组类型的变量array,此时指针的步长是整个数组长度
for(i= 0;i<ARRAY_SIZE;i++){
(*p_array)[i] = 2*i+2;//通过指针操作数组内存空间
}
for(i= 0;i<ARRAY_SIZE;i++){
printf("%d\n",(*p_array)[i]);
}
printf("Hello World!\n");
return 0;
}
多维数组
本质推演
多维数组名就是一个数组指针变量,指向除了最高维以外的剩余维数的数组
多维数组名是一个多级指针,取以后减少一级指针。同样的对于二级指针,取*以后变成一级指针,二级指针指向一块内存,常是一个数组,一级指针指向一个数组里面的元素。
n级指针的值和n-1级指针的值(就是地址相等)重合,拿二维数组来说,就是某一行整个行的地址(一个数组地址)和该行首元素的地址在相等,这是必然的,他们都是该片内存的起始位置,必然相等。但是他们的数据类型不一样。n级指针指向的内存块更多,n-1级指针指向的只是n级指针指向的内存块的一部分,常是其中的一个元素。
多维数组char a[i][j] ==> ((a+i)+j)转换技巧分析
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
void main()
{
int aaa[5][3];
for (i = 0; i<5; i++)
{
for (j = 0; j < 3; j++)
{
aaa[i][j] = j + i + 1;
}
}
for (i = 0; i<5; i++)
{
printf("\n");
for (j = 0; j < 3; j++)
{
printf("aaa[%d][%d] = %d\t",i,j, aaa[i][j]);
}
printf("\n");
}
printf("aaa地址:%d\n", aaa);
printf("aaa[0][0]地址:%d\n", &aaa[0][0]);
printf("aaa+1地址:%d\n", aaa+1);
printf("aaa[1][0]地址:%d\n", &aaa[1][0]);
printf("*(aaa+1)地址:%d\n", *(aaa + 1));
printf("*(aaa + 1)+1地址:%d\n", *(aaa + 1)+1);
printf("aaa[1][1]地址:%d\n", &aaa[1][1]);
printf("&aaa+1地址:%d\n", &aaa+1);
printf("aaa[4][2]地址:%d\n", &aaa[4][2]);
printf("hello...\n");
system("pause");
return;
}
运行结果
/**************
aaa[0][0] = 1 aaa[0][1] = 2 aaa[0][2] = 3
aaa[1][0] = 2 aaa[1][1] = 3 aaa[1][2] = 4
aaa[2][0] = 3 aaa[2][1] = 4 aaa[2][2] = 5
aaa[3][0] = 4 aaa[3][1] = 5 aaa[3][2] = 6
aaa[4][0] = 5 aaa[4][1] = 6 aaa[4][2] = 7
aaa地址:14023660
aaa[0][0]地址:14023660
aaa+1地址:14023672
aaa[1][0]地址:14023672
*(aaa+1)地址:14023672
*(aaa + 1)+1地址:14023676
aaa[1][1]地址:14023676
&aaa+1地址:14023720
aaa[4][2]地址:14023716
hello...
请按任意键继续. . .
************************/