一维数组
int a[]={1,3,5}
a:数组首行首元素地址,一级指针
&a:整个数组的首地址,二级指针
a+1:跳4个字节
&a+1:跳12个字节
sizeof(a) :取的是整个数组长度12字节
sizeof(a[0]):取的是数组首元素,4字节
sizeof(&a):传的是一维数组整个数组的地址(首行地址),4个字节
&a :首行地址
*&a -> a:首行首元素地址
-----------------------------------
数组指针变量
int a[10];
一种方式
typedef int ARRARY[10];
ARRARY *p;
p=&a //p指向a数组,指向一维数组的指针
(*p)[i] //指针操作方式
//p=&a
//*p->*(&a)->a
//(*p)[i]->a[i]
二种方式:直接定义数组指针变量
int (*p)[10];
p=&a;
三种方式,先定义数组指针类型,再根据类型定义指针变量
typedef int (*Q)[10];
Q=p;
p=&a;
----------------------------------------------------------------------
多维数组
内存中不存在多维数组,都是线性存储的
int a[3][5]={0};
int *b=(int *)a;
int i=0
for(i=0;i<1;i++)
{
printf("%d",b[i]);
}
int a[3][5]={0};
a:二维数组首元素地址,代表首行地址,相当于一维数组整个的数组地址,相当于上面的一维的&a
*a:首行首元素地址,相当于一维数组首元素地址,相当于一维的a
a+i -> &a[i] :第i行地址
*(a+i)->*&a[i]->a[i]:第i行首元素地址
*(a+i)+j->a[i]+j->&a[i][j]:第i行第j列元素的地址
*(*(a+i)+j)->a[i][j]:第i行j列元素的值
int a[3][5]={0};
sizeof(a):二维数组整个数组长度:4*3*15=60字节
sizeof(a[0]):a[0]为第0行首元素地址,相当于测第0行一维数组的长度:4+5=20字节
sizeof(a[0][0]):a[0][0]为第0行第0列的元素长度:4个字节
多维数组名,实际上是一个数组指针变量
int a[3][5]={0};
int (*p)[5];
p=&a是整个二维数组的首地址,不能直接给p,会报警告。
p=a //a是第0个一维数组整个数组的地址,无需加&
二维数组做形参的三种形式
int a[3][5]={0};
一种
void println(int a[3][5]);
二种
void println(int a[][5]);
三种
void println(int (*a)[5]);
-----------------------------------------------------------------
指针数组
char *str[]={"1111","44444444"};//先是数组,后是指针,每个元素都是指针
指针数组做形参
void funa(char *str[]);
void funb(char **str);