数组指针、指针数组的一点心得

数组指针(本质是指针):

int main()
{
	double(*a)[3][6];
	//a----------double(*)[3][6]  数组指针(指向一个二维数组)
	//*a---------double[3][6]   double(*)[6]  数组指针(行指针,指向一个一维数组)
	//**a--------double[6]   元素指针
	//***a-------double  
	cout << sizeof(a) << endl;//4
	cout << sizeof(*a) << endl;//3*6*8=144
	cout << sizeof(**a) << endl;//6*8=48
	cout << sizeof(***a) << endl;//8


	double b[3][6];//b的类型是double[3][6],是行指针
	double(*p1)[6] = b;//p1的类型是double(*)[6]

	double c[6];//c的类型是double[6],是元素指针
	double(*p2)[6] = &c;//元素指针转换为行指针
	//所以*p2是一个元素指针
	
	system("pause");
	return 0;
}

接下来说一下直接使用一重指针访问二维数组元素

显然,这是地址连续的情况下可以这样使用。而动态内存分配创建的二维数组是不能这样用的,因为各个一维数组之间是不连续的。

int main()
{
	double a[2][3] = { { 1,2,3 },{ 4,5,6 } };
	//使用一重指针访问二维数组元素
	double*p = (double *)a;
	cout << *(p + 1 * 3 + 2) << endl;//6   自己算偏移量就行了
	
	
	system("pause");
	return 0;
}

最后来一个动态内存分配的例子(二重指针):

int main()
{
	int**a = new int*[3];//a是一个二重指针(其实a就是指针数组的数组名)
	for (int i = 0; i < 3; i++)
	{
		a[i] = new int[4]();
	}

	int*b[3];//指针数组
	b[0] = a[0];
	b[1] = a[1];
	b[2] = a[2];
	for (int i = 0; i<2; i++)
		for (int j = 0; j < 3; j++)
		{
			cout << b[i][j] << endl;
		}


	for (int i = 0; i < 3; i++)
		delete[] a[i];
	delete[]a;
	system("pause");
	return 0;
}
int main()
{
	int a[2][3] = { { 1,2,3 },{ 4,5,6 } };
	

	int*b[3];//指针数组,数组中的每个元素的类型都是int*
	b[0] = a[0];//a[0]等价*a,是元素指针,类型是int*
	b[1] = a[1];
	b[2] = a[2];

	for(int i=0;i<2;i++)
		for (int j = 0; j < 3; j++)
		{
			cout <<b[i][j] << endl;
		}
	
	system("pause");
	return 0;
}
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页