指针数组和数组指针

指针和数组

指针:指针相当于一个变量,不过它存放的是其它变量在内存中的地址。

数组:数组是用于储存多个相同类型数据的集合,且数组中的元素在内存中是连续存放的

指针数组和数组指针的区别?

指针数组(array of pointers):本质上是一个数组,只不过数组中的所有元素都是指针类型;

数组指针(a pointer to an array):本质上是一个指针,只不过该指针指向一个数组的首地址。
在这里插入图片描述

优先级:++ > () > [] > * > +

指针数组

指针数组的定义

int* a[4];
//定义了一个数组,该数组大小为4,且数组中元素类型为int型指针
//根据上面的优先级,int*a[4]等价于int*(a[4])

指针数组的大小

cout<<sizeof(a)<<endl;
//由于指针数组本质是数组,所以实际上是计算数组所占的字节数,对于x86,指针占4个字节,所以输出16,对于x64,指针占8个字节,所以输出32

指针数组的赋值

int arr_a[4] = { 1,2,3,4 };
//将arr_a中的元素赋给数组a,又由于数组a中元素类型是int*,所以将arr_a中每个元素的地址赋给arr中每个元素
for (int i = 0; i < 4; i++) {
    a[i] = &arr_a[i];
}
for (int i = 0; i < 4; i++) {//输出为arr_a中每个元素的地址
		cout << a[i] << " ";
}
cout<<endl;
for(int i=0;i<4;i++){ //输出为1234
    	cout << *a[i] << " ";
}

从下图可以看到,指针数组中每个元素的值,是所赋数组中每个元素的地址值,要想抓住获取所赋数组中每个元素的值,还需要解引用*在这里插入图片描述

之所以arr_a数组中的元素,比如arr_a[0]在内存中以01 00 00 00的方式存储,而不是以00 00 00 01的方式,是因为intel系列CPU以小端序方式来保存数据

数组指针

数组指针定义

int(*b)[4];//定义了一个指针,该指针指向一个数组,且该数组大小为4,数组中元素类型为int型

数组指针的大小

cout << sizeof(b) << endl;
//由于数组指针本质是指针,所以实际上是计算指针所占的字节数,对于x86,指针占4个字节,所以输出4,对于x64,指针占8个字节,所以输出8

数组指针的赋值

int arr_b[4] = { 1,2,3,4 };
b=&arr_b;
for (int i = 0; i < 4; i++) {//输出为1 2 3 4
		cout << (*b)[i] << " ";
}

从下图可以看到,数组指针中存放的就是所赋数组的首地址在这里插入图片描述
注意:不能将数组直接传递给数组指针,因为数组指针存放的数组首地址,并不是数组首元素地址,虽然两者值是相同,但是操作不同,比如arr_b+1相对于数组首地址+元素大小,而b+1相对于数组首地址+数组大小,所以类型不匹配不能直接赋值,而可以b=&arr_b,b相对于二维数组的行地址,现在指向arr_b

int main()
{
	int(*b)[4];
	int arr_b[4] = { 1,2,3,4 };
	b = &arr_b;
	cout << "sizeof(arr_b): " << sizeof(arr_b) << endl;
	cout << "arr_b首地址: " << arr_b << endl;
	cout << "arr_b+1: " << arr_b + 1 << endl;
	cout << "b: " << b << endl;
	cout << "b+1: " << b+1 << endl;
	return 0;
}

输出结果如下:
在这里插入图片描述

参考:
指针数组与数组指针详解
数组和指针的区别与联系(详细)

  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倒地不起的土豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值