静态数组:
int a[10];
char b[10];
float c[10];
test a[10]; //test为自定义的类,定义一个包含十个test对象的数组
以上都是静态数组的声明方式。需要注意的是静态数组是在编译期间就已经分配好内存,所以一定要指定数组的大小,不能以变量作为数组的大小int i;
char a[i]; //这是不允许的,编译期间不能确定i的值,所以无法明确数组的大小,导致编译失败
动态数组:
//C语言中利用malloc函数来创建动态数组
int i;
scanf("%d",&i);
char *p = (char *)malloc(sizeof(char)*i);//分配长度为i的字符数组空间,可以以下标的形式去访问数组。不需要时要调用free()函数手动释放。
//C++中,利用new关键字创建动态数组
int i ;
cin>>i;
char *p = new char[i];//分配长度为i的字符数组空间,可以以下标的形式去访问数组。不需要时要delete p,手动释放。
二维数组地址:
从图中看似a+i和a[i]指向的都是a[i][0],其实不然。a+i指向的是a[i],因为a[i]=*(a+i),这个比较难理解的。
void main(){
int a[3][2]={1,2,3,4,5,6};
cout<<*a[1]<<endl;
cout<<*(a+1)<<endl;
}
运行结果a[i]的确指向的是a[i][0],但a+1取值后仍然是一个地址指向a[i][0]。
可以这样理解,a+i指向的是特殊一维数组的第i个元素,第i个元素还是一个一维数组。*(a+i)直面的意思是想取出第i个元素的内容,但a+i所指空间还是个数组,难道*(a+i)直接就能将整个数组取出来?要知道数组都是通过下标一个个进行访问的,不能整体获得。所以*(a+i)只是获得这个数组空间首元素的地址,这样就可以通过下标对内容进行访问。
最后总结一下:
对于二维数组a[3][2],若看成3行2列的形式。
(1)a+i指向第i行,此时还没有获得第i行元素首地址,没有办法访问其中的元素
(2)*(a+i)或a[i]指向第i行首元素,获得第i行元素的首地址。
(3)a[i]+j指向第i行第j个元素,可以通过a[i]第i行元素的首地址访问各个元素。关键是要记住a[i]=*(a+i),
a[i][j]=*(*(a+i)+j)。
动态二维数组的创建:
void main(){
int row,col;
cin>>row>>col; //自定义行数和列数
int **a = new int*[row]; //分配指向行的指针数组,因为(*行指针)才能得到每行首元素的地址,所以可以理解为行指针是指向首元素指针的指针
for(int k=0; k<row; k++){
a[k] = new int[col]; //分配行指针所指向的数组
}
for(k=0; k<row; k++){
delete [] a[k]; //释放所有行空间
}
delete [] a; //释放行指针数组
}
C中:
void main(){
int row,col;
scanf("%d,%d",&row,&col); //自定义行数和列数
int **a = (int**)malloc(sizeof(int *) * row); //分配指向行的指针数组
for(int k=0; k<row; k++){
a[k] = (int *)malloc(sizeof(int) *col); //分配行指针所指向的数组
}
for(k=0; k<row; k++){
free(a[k]); //释放所有行空间
}
free(a); //释放行指针数组
}