int a[]={1,3,5}
a:数组第一行第一个元素的地址,一级指针
&a:整个数组首地址,二级指针
a+1:跳转4个字节
&a+1:跳转12字节
(a):整个数组的长度为12字节。
(a[0]):取数组第一个元素,4字节
(&a):传递的是整个一维数组的地址(第一行地址),4字节
&a:首行地址
*&a -> a:第一行第一个元素的地址
----------------------------------
数组指针变量
整数a[10];
一个方法
整数[10];
*p;
p=&a //p指向a数组,指向一维数组的指针
(*p)[i] //指针操作模式
//p=&a
//*p->*(&a)->a
//(*p)[i]->a[i]
两种方式:直接定义数组指针变量
整数(*p)[10];
p=&a;
三种方式,先定义数组指针类型,然后根据类型定义指针变量
int (*Q)[10];
Q=p;
p=&a;
-------------------------------------------------- -------------------
多维数组
内存中不存在多维数组,都是线性存储的。
int a[3][5]={0};
int *b=(int *)a;
整数i=0
为(i = 0; i {
(“%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};
(a):二维数组整个数组长度:4*3*15=60字节
(a[0]):a[0]是第0行第一个元素的地址,相当于测量第0行一维数组的长度:4+5=20字节
(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 (int a[3][5]);
两种
void (int a[][5]);
三种
无效(int(*a)[5]);
-------------------------------------------------- ----------------
指针数组
char *str[]={"1111",""};//先是数组,然后是指针,每个元素都是指针
指针数组作为形式参数
无效funa(char *str[]);
无效 funb(char **str);