一维数组,二维数组,数组指针,指针数组

一维数组
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);


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值