一维数组
一维数组数组名可以视为指向第一个元素的指针(但数组名与指针实际上是不同的,比如用sizeof
运算符求值时,sizeof
对数组名求值会给出数组所占字节大小,而作用于指针时会给出指针字节数;但当数组名作为参数传递给函数时,它会失去这一额外信息)。
int num;
int *array;
scanf("%d", &num);
array = (int *)malloc(num*sizeof(int));
二维数组
二维数组可以视为一个一维数组,数组中每一项为另一个一维数组的数组首地址。
列数固定的二维数组
#define COL 10
int row; //这个就是需要指定的行数
int (*p)[COL]; //p的类型为指向一个大小为col的一维数组的指针。比如`int a[col]; p=&a;`
printf("input the row of the array: ");
scanf("%d", &row); //取得行数
//动态生成二维数组,指定列数为col
p = (int (*)[COL])malloc(row*COL*sizeof(int)); //动态申请row行col列的二维数组
int i, j;
for (i=0; i<row; i++) {
for (j=0; j<COL; j++) {
p[i][j] = i*10 + j;
}
}
for (i=0; i<row; i++) {
for (j=0; j<COL; j++) {
printf("%3d,", p[i][j]);
}
printf("\n");
}
free(p);
列与行都不固定的二维数组
int row;
int col;
int **array = NULL;
printf("input the row of the array: ");
scanf("%d", &row);
printf("input the col of the array: ");
scanf("%d", &col);
/*
* 将array视为一个有row项`(int *)`型指针的一维数组
*/
array = (int **)malloc(row * (sizeof(int *)));
if (array == NULL) {
return NULL;
}
int i;
int j;
for (i = 0; i < row; i++) {
/*
* 将array的每一项视为一个`int`型的一维数组
*/
array[i] = (int *)malloc(col * sizeof(int));
if (array[i] == NULL) {
return;
}
}
/*input data*/
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
array[i][j] = i*10 + j;
}
}
/*output data*/
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
printf("%3d", array[i][j]);
}
puts("");
}
/*free every row point*/
for (i = 0; i < row; i++) {
free(array[i]);
}
free(array);
用一维数组模拟二维数组
typedef struct {
int row;
int col;
int *base;
} Table;
void init_table(Table *t, int row, int col)
{
t->row = row;
t->col = col;
t->base = (int *)malloc(sizeof(int)*row*col);
if (t->base == NULL){
printf("Init table failed");
}
}
#define ELEMENT(Table, r, c) (*(Table.base + (r)*Table.col + (c)))
一个问题
虽然在上面我将int array[]
与int *array=(int*)malloc(sizeof(int)*5)
中的array互相代替,而且实际上用下标访问时它们的行为确实相同。但实际上它们在某些方面是不同的,比如:
int array[] = {1,2,3,4,5};
int *ptr = (int*)malloc(sizeof(int)*5);
printf("%lu\n", sizeof(array)); //会打印出数组所占的字节长度
printf("%lu\n", sizeof(ptr)); //会打印出指针的字节长度
在C/C++中,当数组作为函数的参数进行传递是,数组就自动退化为同类型的指针。
- older
- Newer