#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));
}
数组与指针的笔记
最新推荐文章于 2024-07-04 13:06:05 发布