int *a[n]和int (*b)[n]的区别(易混淆)

int *a[n]( 由返回整型数据的指针所组成的数组 )
1.指针数组;每n个元素全为指针的数组.

2.a是一个指针数组,每一个指向一个int型

方便理解: 是指针数组, 有 n 个成员,每个成员都是一个指针,共有n个指针

int (*b)[n]( 指向由整型数据组成的数组的指针 )
1.数组指针;指针类型是 int [n]类型的数组.指向n个元素组成的数组的一个指针。

2.b是一个指针,指向int[n]的数组。

方便理解:小括号优先,所以 是 1个指针,用来指向 有n个元素的数组。

结合优先级:
[]的优先级比*的优先级高。
所以:

int *a[n]

////a先与[n]结合变为a[n],再与*结合最终为*a[n]。

方便理解:int *a[n],视为int* a[n],是int*类型的,所以每个元素的数组都是int*类型的。 

int(*b)[n]

////b先为(*b),再与*结合最终变为(*b)[n]。

方便理解:(*b)可以看作是*b,指针指向的内容(是假设,有助于理解,不是指向的内容),是int[n],一个指针指向整个数组。

int *a[n]例子运用

/*int m[3] = { 8, 4, 3 };
	a[0] = &m[1];
	a[1] = &n[2];
	a[2] = &x[3];也可以用在一维数组*/
	int *a[3];
	int m = 8, n = 4, x = 3;
	//a = &m;错误
	a[0] = &m;
	a[1] = &n;
	a[2] = &x;
	cout <<"a的值不等于a[0]:"<<a<< endl;
	cout << "a[0]是m的地址:" << a[0] << endl<<endl;

	cout << "*a[0]是指向m的地址的内容:" << *a[0]<<endl;
	cout << "*a[1]是指向n的地址的内容:" << *a[1] << endl;
	cout << "*a[2]是指向x的地址的内容:" << *a[2] << endl << endl;;

	cout << "*a[0]+1是指向m的地址的内容加1:" << *a[0] +1<< endl;
	cout << "*(a[0+1] )是指向m的地址的内容加1:" << *(a[0+1] ) << endl;
打印结果:



int *a[n]和二维数组

int *a[3];
	int m[2][3] = {9,88,55,22,44,66};
	//a = &m;错误
	a[0] = m[1];

	cout <<"a的值不等于a[0]:"<<a<< endl;

	cout << "a[0]是含有三个元素的m[0]的地址:" << a[0]<< endl<<endl;

	cout << "*a[0]是含有三个元素的m[0]的m[1][0]首地址:" << *a[0] << endl << endl;

	cout << "*a[0] + 1是含有三个元素的m[0]的m[1][0]首地址+1的值:" << *a[0] + 1 << endl << endl;

	cout << "*(a[0]+1)是含有三个元素的m[0]的m[1][1]的值:" << *(a[0]+1) << endl << endl;

	cout << "*a + 2是产生其他随机的值:" << *a + 2<< endl << endl;//无意义
打印结果:

int *a[n]的a[i][j]直接输出数组m[x][j]的内容(x不一定等于i)

int *a[3];
	int m[2][3] = {9,88,55,22,44,66};
	//a = &m和a[0] = &m和a[0] = &m[1]都是错误
	a[0] = m[1];
	cout << "a[0][0]是含有三个元素的m[1]的m[1][0]的内容:" << a[0][0] << endl;

打印结果:


int *a[n]在二维数组上,可以间接表现为指针的指针**a

int* a[2];
	int m[3] = { 8, 99, 10 };
	int n[4] = { 11, 22, 33, 44 };
	a[0] = m;
	a[1] = n;
	for (int i = 0; i < 3; i++)
	{
		cout << "*a[0] + i 是m[i]的第i个元素加1的值:" << *a[0] + i << endl;
		cout << "**a+i是m[i]的第i个元素加1的值:" << **a + i << endl;
		cout << " *(*a+i)是m[i]的下一个元素的内容:" << *(*a + i) << endl;
		cout << " *a+i是m[i]的下一个元素的地址值:" << *a + i << endl;
		cout << " 验证a[0]和*a是m的地址值:" <<"*a:"<< *a <<"  a[0]:"<< a[0] <<"  &m:"<<&m<< endl;
		cout << endl;
	}
打印结果:


int *a[n]动态二维数组的用法

int** a;
	int *b[2];
	a = new int*[2];
	int m[3] = { 22, 33, 44 };
	int n[4] = { 4, 5, 6, 7 };
	a[0] = m; // *a = m;
	a[1] = n; // *(a+1) = n;
	b[0] = m;//b[0]和a[0]运用效果一样的,但是类型不一样。b[0]是int *b[0],而a[0]是int **a.
	for (int i = 0; i < 3; i++)
	{
		cout << " a[0][i]是m[3]数组的第i个元素:" << a[0][i] << "   和a[0][i]等价的是*array[0] + i:" 
			<< *a[0] + i<< "   和a[0][i]等价的是*(b[0] + i):" << *(b[0] + i) << endl<<endl;
	}
打印结果:


相关动态二维数组的知识,博客链接:

http://blog.csdn.net/lavorange/article/details/42879605

int *a用*a进行赋地址值(结合上面的解释,理解就不难)

int m[4] = { 55, 77, 88, 99 };
	int n[3] = { 58, 85, 666 };
	int *a[2];
	
	*a = m;//等价于a[0]=m;
	*(a + 1) = n;//等价于a[1]=n;
	cout << **a << endl;//输出55
	cout << **(a+1) << endl;//输出58

由此可以分析地址存储分配情况:


关于与int (*p)[n]的区别:

文章链接:http://blog.csdn.net/chen1083376511/article/details/78382473

猜你喜欢

转载自blog.csdn.net/chen1083376511/article/details/78386419