C++学习笔记五之指针与数组地址的偏移运算

221 阅读2分钟

指针与数组地址的偏移运算

笔记代码

int n[3][4] = {
		{1,2,3,4},
		{9,8,7,6},
		{10,11,12,13}};
	//定义一个数组指针
	int(*pn)[4] = n;

	cout << *(*(pn + 1) + 2) << endl;//n[1][2]
	cout << *(*(pn + 2) -5) << endl;//n[0][3]
	cout << *(*pn+7) << endl;//n[1][3]
	cout << *(*pn++ + 2) << endl;//n[0][2]
	//*(*(pn-1)+6)
	cout << *(pn[-1] + 6) << endl;//n[1][2]
	//**(pn+1)
	cout << *pn[1] << endl; //[]>*  n[2][0]
	pn = n;
	//定义一个指针数组
	int* p[3] = { n[1], n[2], n[0] };
	//定义一个二级指针
	int **pp = p;
	cout << *(p[0] + 3) << endl;//6
	cout << **pp++ << endl;//9
	cout << *(*(pp + 1) + 2) << endl;//3
	//*(pp+0)
	cout << *(pp[0]++ - 2) << endl;//7
	//*(*(pp+0)-1)
	cout << pp[0][-1] << endl;//10

练习代码

int n[3][4] = {
		{ 1, 2, 3, 4 },
		{ 5, 6, 7, 8 },
		{ 9, 10, 11, 12 }
	};
	int(*pn)[4] = n;
	int *p[3] = { n[2], n[1], n[0] };
	int **pp = p;
	//定义一个数组指针
	int(*pm)[3][4] = &n;
	//转换为*(*(pn + 1))-->*(n[1])-->n[1][0]-->5
	cout << **++pn << endl;
	//转换为*(*(p - 1) + 2)-->n[0][2]-->3
	cout <<*(pn[-1]+2) << endl;
	//转换为*(*(pn + 1) + 0) + 2 --> n[2][0] + 2 --> 11
	cout << *pn[1] + 2<< endl;
	//转换为*(*(pn - 1) + 5) --> n[0][5] --> 6
	cout << pn[-1][5]<< endl;
	//转换为*(*(p + 2) - 4)--> n[2][0] --> 9
	cout << pn[2][-4] << endl;

	//转换为*(*(pp + 1)) --> n[1][0] --> 5
	cout << **++pp << endl;
	//转换为*(*(pp + 0) + 1) --> pp[0][1] -> n[1][1] = **pp = 6
	cout << *++pp[0] << endl;
	//转换为*(*(p - 1) + 2) --> n[2][3] = 11
	cout << pp[-1][2] << endl;
	//转换为*(*(p + 0) + 1) --> n[1][2] = 7
	cout << pp[0][1] << endl;
	return 0;