赞
踩
2.a是一个指针数组,每一个指向一个int型
方便理解: 是指针数组, 有 n 个成员,每个成员都是一个指针,共有n个指针
int (*b)[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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。