误区
- 数组名字有时候可以当做指针来用,但数组的名字不是指针,尽管数组使用自身的名字可以返回数组地址,但是名字本身不能作为赋值操作的目标。
一维数组
int vector[5];
printf("%d\n,sizeof(vector/sizeof(int));
二维数组
int matrix[2][3]={{1,2,3},{3,4,6}}
//如果只用一个下标访问数组,得到的是对应行的指针
for(int i=0;i<2;i++)
{
printf("&matrix[%d]:%p sizeof(matrix[%d]): %d\n",
i,&matrix[i],i,sizeof(matrix[i]));
}
&matrix[0]:100 sizeof(matrix[0]): 12
&matrix[1]:112 sizeof(matrix[1]): 12
二位数组的内存映射:
多维数组
元素按照行-列-阶顺序连续分配。
指针表示法和数组
单独使用数组名字时会返回数组地址,我们可以把地址赋给指针。
int vector[5]={1,2,3,4,5};
int * pv=vector;
//pv变量是指向数组第一个元素而不是指向数组本身。
printf("%p\n",vector);
printf("%p\n",&vector[0]);
//上面两种方法是等效的
*(pv+i);
*(vector+i);
//上面两种也是等价的
/*****区别********/
sizeof(pv); //返回4,就是指针的长度
sizeof(vector); //返回5
vector=vector+1; //语法错误,数组名字不是左值,不可以被修改。
使用指针的一维数组
int * arr[5]; //指针数组,里面存放着指针(int*型)
for(int i=0;i<5;i++)
{
//①
arr[i]=(int*)malloc(sizeof(int));
*arr[i]=i; //数组里面存放的指针解引
//②(arr+i)表示数组的第i个元素的地址
*(arr+i)=(int *)malloc(sizeof(int));
**(arr+i)=i;
//①==②
}
指针和多维数组
可以将多维数组的一部分看做子数组。
数组按行-列顺序存储。
int matrix[2][5]={{1,2,3,4,5},{6,7,8,9,10}};
/**声明一个指针来处理这个数组。**/
int (*pmatrix)[5]=matrix;
//先看括号里面声明了一个指针*pmatrix
//指针指向什么 int [5] ,一个含有5个整型的数组
//注意与上面的指针数组区分开
printf("%p/n",matrix); 100
printf("%p/n",matrix+1); 120
//matrix+1返回的地址偏移了第一行的长度
//二维数组是数组的数组
matrix[0]; //是一个长度为5的int型的数组的名字。
printf("%d/n",sizeof(matrix[0])); 20
//访问数组的第二个元素
*(matrix[0]+1);
printf("%p %d \n",matrix[0]+1,*(matrix[0]+1)); 104 2
//下面两个式子垂直变化,演化
//matrix、与&matrix[0][0]数值相等,但意义不同
//指向数组的指针,一个整数的指针
**(matrix+1) *(*matrix+1)
**(&a[0]+1) *(*&a[0]+1)
*a[1] *(a[0]+1)
*&a[1][0] *(&a[0][1])
a[1][0] a[0][1]
6 2
传递多维数组
要传递数组matrix,有两种办法:
//列数一定要明确
void haha(int (*hh)[5],int rows){}
void haha(int hh[][5],int rows){}
遇到形参为一个指针加行列的
void dispaly(int*arr,int rows,int cols)
{
for(int i=0;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
*(arr+(i*cols)+j); //只能用这样的办法
}
}
}
//这里没有将指针声明为二维数组,所以不能用数组下标来表示,只能用指针来表示。
dispaly(&matrix[0][0],2,5);
动态分配二维数组
//内存连续的分配方法1
int matrix[2][5]={{1,2,3,4,5},{6,7,8,9,10}};
//内存连续分配方法2,内存情况见下图
int rows=2;
int cols=5;
int **matrix=(int **)malloc(rows*sizeof(int*));
matrix[0]=(int*)malloc(rows*cols*sizeof(int));
for(int i=1;i<rows;i++)
matrix[i]=matrix[0]+i*cols
//分配可能连续的内存,内存情况见下图
int rows=2;
int cols=5;
int**matrix=(int**)malloc(rows*sizeof(int*));
for(int i-0;i<rows;i++)
{
matrix[i]=(int*)malloc(cols*sizeof(int)):
}