当前位置:   article > 正文

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

(*a)[b]
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]例子运用

  1. /*int m[3] = { 8, 4, 3 };
  2. a[0] = &m[1];
  3. a[1] = &n[2];
  4. a[2] = &x[3];也可以用在一维数组*/
  5. int *a[3];
  6. int m = 8, n = 4, x = 3;
  7. //a = &m;错误
  8. a[0] = &m;
  9. a[1] = &n;
  10. a[2] = &x;
  11. cout <<"a的值不等于a[0]:"<<a<< endl;
  12. cout << "a[0]是m的地址:" << a[0] << endl<<endl;
  13. cout << "*a[0]是指向m的地址的内容:" << *a[0]<<endl;
  14. cout << "*a[1]是指向n的地址的内容:" << *a[1] << endl;
  15. cout << "*a[2]是指向x的地址的内容:" << *a[2] << endl << endl;;
  16. cout << "*a[0]+1是指向m的地址的内容加1:" << *a[0] +1<< endl;
  17. cout << "*(a[0+1] )是指向m的地址的内容加1:" << *(a[0+1] ) << endl;
打印结果:



int *a[n]和二维数组

  1. int *a[3];
  2. int m[2][3] = {9,88,55,22,44,66};
  3. //a = &m;错误
  4. a[0] = m[1];
  5. cout <<"a的值不等于a[0]:"<<a<< endl;
  6. cout << "a[0]是含有三个元素的m[0]的地址:" << a[0]<< endl<<endl;
  7. cout << "*a[0]是含有三个元素的m[0]的m[1][0]首地址:" << *a[0] << endl << endl;
  8. cout << "*a[0] + 1是含有三个元素的m[0]的m[1][0]首地址+1的值:" << *a[0] + 1 << endl << endl;
  9. cout << "*(a[0]+1)是含有三个元素的m[0]的m[1][1]的值:" << *(a[0]+1) << endl << endl;
  10. cout << "*a + 2是产生其他随机的值:" << *a + 2<< endl << endl;//无意义
打印结果:

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

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

打印结果:


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

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


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

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


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

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

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

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

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


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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/编程领航者/article/detail/63149
推荐阅读
相关标签
  

闽ICP备14008679号