C++深入指针和数组

文章目录

一定要理解跨度

No1

#include <iostream>
using namespace std;
int main() {
    int a[]={1,2,3,4,5};
    //&a+1是整个数组的一个跨度(无论a是多少维数组)
    int *p = (int*)(&a+1);
    
    cout<< *(a+1) <<endl;//2
    cout<< *(p-1) <<endl;//5
}

在这里插入图片描述

No2

#include <iostream>
using namespace std;
int main() {
    int a[2][2][3]={{{1,2,3},{4,5,6}},{{7,8,9},{10,11,12}}};

    //跨度整个数组
    int *p = (int*)(&a+1);

    //跨度是[2][2][3]除去第一个,也就是6int
    cout<< *(int*)(a+1) <<endl;//7

    //跨度是[2][2][3]除去前两个,也就是3int
    cout<< *(int*)(*a+1) <<endl;//4

    //跨度是[2][2][3]除去前三个,也就是1int
    cout<< *(int*)(**a+1) <<endl;//2
    cout<< *(p-1) <<endl;//12
    
}

在这里插入图片描述

No3

#include <iostream>
using namespace std;
int main() {
	static const char*s[]={"black","white","pink",
	"violet"};
	const char** ptr[]={s+3,s+2,s+1,s},***p;
	p=ptr;
	++p;
	cout<< **p+1 <<endl;//ink 输出的是一个字符及其之后的内容
	return 0;
}

No4

#include <iostream>
using namespace std;
int main() {
	int a[3][4]={{1,2,3,4},
				 {2,3,4,5},
				 {3,4,5,6}};
	int b[3][4]={{10,11,12,13},
				 {11,12,13,14},
				 {12,13,14,15}};
	int (*aa[2])[4]={a,b};//*aa[2] == aa[2][3]
	int *p1[3]={a[0],a[1],a[2]};
	int *p2[3]={b[0],b[1],b[2]};
	int **pp[2]={p1,p2};
	int ***p=pp;//p[2][3][4]

	cout<< (*(*p+2))[1] <<endl;//4  a[2][1]
	cout<< aa[1][2]-aa[1][0] <<endl;//8
	
	return 0;
}

在这里插入图片描述

No5

#include <iostream>
using namespace std;
int main() {
	const char* str[]={"Welcome","to","Beautiful","nanjing"};
	const char **p = str+1;
	
	str[0]=(*p++)+2;//后置++,先使用*p,后p++ 
	str[1]=*(p+1);
	str[2]=p[1]+3;
	str[3]=p[0]+(str[2]-str[1]);

	cout<< str[0] <<endl;//空字符
	cout<< str[1] <<endl;//nanjing
	cout<< str[2] <<endl;//jing
	cout<< str[3] <<endl;//g
	
	return 0;
}

No6

#include <iostream>
using namespace std;
int main() {
	const char* str[]={"Welcome","to","Beautiful","nanjing"};
	const char **cp[]={str+3,str+2,str+1,str};
	const char*** cpp = cp;

	cout<< **++cpp <<endl;//Beautiful
	cout<< *--*++cpp+3 <<endl;//come
	cout<< *cpp[-2]+3 <<endl;//jing
	cout<< cpp[-1][-1]+1 <<endl;//o
	
	
	return 0;
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值