C/C++里的解引用与多维数组指针(面经)

11 篇文章 1 订阅

++与解引用运算符

在C语言中,解引用操作符*和自增++操作符的优先级如下:

  • 解引用操作符:优先级最高
  • ++ 自增操作符++:优先级较低
    所以,在同一个表达式中,*会先于++进行运算。

例如:

- *p++   // 先解引用p,然后p自增,返回*p.
- *(p++) //先解引用p,然后p自增,返回*p.
- (*p)++ // 先解引用p,然后解引用值自增,返回*p.
- ++*p  // 先解引用*p,然后*p自增,返回自增后的值.
- ++(*p)// 先解引用*p,然后*p自增,返回自增后的值.

多维数组指针

同类型的指针可以相减

二维数组

	int arr[2][7] = { 0 };
	auto p = arr;  //p为一维指针
	int(*bias)[7] = p;
	cout << p++ << "\r\n"; //arr[0]
	cout << p++ << "\r\n";  //arr[1]
	cout << p++ << "\r\n";//arr[2]
	cout << p[0] << "\r\n";// arr[3]
	cout << p[0][0] << "\r\n";
	cout << (bias==arr?true:false) << "\r\n";

解析 :arr为一维数组指针.arr++则地址自增sizof(int)*7.7为列数.
p=arr->p[0]第0行.以此类推.


   	int arr[2][7][4] = {0};
	auto p = arr;
	int(*bias)[7][4] = p;  //三维指针的数据类型
 
	cout <<"地址相差"<< (int)(p - arr) << "\r\n"; // 1
 
	cout << "-------------------------------" << endl;

	//打印其类型
	cout << typeid(p).name() << "\r\n"; //指向三维数组
	cout << typeid(p[0]).name() << "\r\n";  //指向二维数组
	cout << typeid(p[0][0]).name() << "\r\n";  //指向一维数组
	cout << (bias==arr?true:false) << "\r\n";

	auto p2 = p[0]; //三维降到二维
	cout << p2++ << endl;
	cout << p2 << endl; //相差16个字节 也就是[4]

	cout << "--------------------------------" << endl;
	auto p3 = p[0][0];  //三维降到一维
	cout << p3++ << endl;
	cout << p3 << endl; //相差4个字节

> 解析 : p为三维数组指针. p++地址自增7*4*sizeof(int).7,4为后二维.p[0]为二维数组指针,执行++地址自增4*sizeof(int).p[0][0]为一维数组指针,执行++地址自增sizeof(int).

规律: n维数组指针自加,地址相差后n-1维相乘再乘以sizeof(类型).

打印结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值