数组与指针的笔记

#include<stdio.h>
void test(int *q);
void test2(int m[]); 
int main()
{
	int score[2][3]={1,2,3,4,5,6};
	int (*p)[3]=score;//数组指针p 
	int *s[2];//指针数组s 
	s[0]=score[0];//指针数组需要一个一个赋地址,有时候需要请求内存 
	s[1]=score[1];
	printf("%d\n",*(*(score+1)+2));//此时的score是int(*)[3]类型的指针 ,解引用之后是一个int[3]数组的首地址 
	printf("%d\n",*(*score+5));//此时的*score是int* 类型的指针,解引用之后就是一个普通的数字 
	printf("%d\n",(*(p+1))[2]);//此时的p是一个int (*)[3]类型的指针,解引用之后是一个普通的int [3]的数组的首地址 
	printf("%d\n",s[1][2]);//此时的s是int *[]型数组的首地址,解引用之后是 一个普通的指针变量,且内部的指针变量类型保持为为其赋值的那个东西的类型 ,所以可以再次解引用 
	//例如这里的s的数据结构实际上和数组score是不同的,较为明显的区别在于存储模式和读取模式,体现于s的大小只有2*8=16字节,而score则占有2*3*4=24字节 
	//读取模式:二维数组score可以看作将6个元素先每3个封装成一组,再把封装好的2组,利用一个一维数组再次封装,封装的时候实质上改变了类型,以防止地址值相同的时候出现的意外读取
	//而指针数组则是保存了数据类型及它的首个地址————即,保留了寻址的步长和封装的保护机制
	//存储模式:二维数组可以抽象的理解为一维数组套了一个一维数组,访问外层一维数组的时候,实质上访问的是整个数组的第一层,想要拿到里面的的值,需要解引用(实质上是改变步长并且类型转换)
	//但是二维数组的每个外层一维数组的内存大小是内层一维数组的大小,而指针数组大小则只有内部指针的大小*个数 
	printf("%d\n",sizeof(s)); 
	printf("%d\n",sizeof(s[0]));
	printf("%d\n",sizeof(score[0]));
	test(*score);//这时候相当于传了一个一维数组进去 
	test2(*score);
	system("pause");
}
void test(int *q)
{
	printf("%d\n",*(q+5));//类型被转换成了普通的int*,相当于列数组的首地址 
}
void test2(int m[])
{
	printf("%d\n",*(m+1));
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值