re学习记录从入门到入狱【15】

指针数组 / 数组指针

1. 指针数组的定义

char arr[10];  //就是一个数组,有10个成员,每个成员宽度为1字节,因为是char类型
char* arr[10]; //指针数组,长度10,名为arr,每个成员为char*指针类型,4字节

指针数组的赋值

int main()
{
	char* a = "Hello";  
	//编译器会在常量区分一块内存,存储Hello的ASCII码
	//然后把内存的地址存到a,所以a和b里存的都是一个地址,因为是char* 所以都是4字节
	char* b = "Cracker";
}

那么我就可以定义一个数组

char* arr[2]={a,b};
//数组里面有两个成员
//每个成员四字节
//内容就是a和b两个地址

//那么也可以这样写
//与上面完全相同
char* arr[2];
arr[0]=a;
arr[1]=b;

//但我们开发中,用如下方式居多
char* arr[2] = {
	"Hello",
	"Cracker"
};

可能看不懂,但是没关系,首先看数组类型char*。
存储的是,两个字符串的内存地址,而不是直接将字符串存储也是与上面一样,就是写法不同
2. 结构体指针数组
任何类型都可以定义数组,结构体呢?

struct poi
{
	int x;
	int u;
};
poi a; //定义一个变量,名为a,类型为结构体类型,宽度是8字节
poi arr[10]; //结构体数组,创建一个数组,数组里有十个成员,每个成员都是poi类型,宽度就是8*10字节
poi* abrr[10]; //结构体指针数组,也是个数组,也有十个成员,但是每个成员都是一个指针,宽度就是4*10字节

所以说,指针数组本质就是数组,只不过里面存的是各种各样的指针
4. 数组指针的使用

int arr[]={1,2,3,4,5,6,7};
int (*px)[7]=&arr;

如果我要取数组里面的值,怎么操作?
*取一个指针类型的值的时候,类型就是减掉一颗星。
加&取地址符的时候是加一颗星
int (px)[7] 所以取得时候去掉一个
那么他现在在我们眼里就是一个数组,我们就可以根据下标随便取值了。

	int arr[] = { 1,2,3,4,5,6,7 };
	int(*px)[7] = &arr;
	printf("%d", (*px)[0]);

在这里插入图片描述

int arr[3][3] = {   //定义一个二维数组
	{1,2,3},
	{4,5,6},
	{7,8,9}
};
int x = &arr[0];  //取第一个成员的地址,也就是{1,2,3}
//那么加一个取地址符*,也就是数组带了个*,就是数组指针

在这里插入图片描述
运行,报错如上图所示,所以&arr[0]就是一个数组指针类型

int (*x)[3] = &arr[0];  //所以我们就可以定义一个数组指针
//取二维数组的第一个元素的地址。
//那么 *x 得到的是什么
//*x就是砍掉一颗星,砍掉一颗星后就是一个数组,宽度为3
//(*x)[0],这样取的是宽度为3的第一个成员,首地址。
//因为此时他在我们眼里就是一个数组,0是取这个数组里的第一个成员。

	printf("%d,%d", (*x)[0], (*x)[1]);  //我们就会取出1和2,运行看下

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值