C/C++中的指针数组和数组指针

Posted 黑铁时代

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++中的指针数组和数组指针相关的知识,希望对你有一定的参考价值。

1. 指针数组

  定义:int *p[n],由于[]的优先级高于*,p和[]结合成一个数组,该数组的元素存储的是int类型的指针,由于数组内容是指针,因此p+1的步长是sizeof(int*),在32位机器上,步长通常是4个字节;

  int a[3][4];

  int *p[3]; // 指针数组,具有3个类型为(int*)的元素;

  p[0] = a[0]; // 将第一个元素的值赋值为a[0];

  p[1] = a[1]; // 将第二个元素的值赋值为a[1];

  p[2] = a[2]; // 将第三个元素的值赋值为a

  

2. 数组指针:

  定义:int (*p)[n],由于()的优先级高于[],p和()结合成一个指针,指向一个具有n个int类型元素的数组,由于指针指向的是一个数组,p+1的步长是sizeof(int)*n,因此数组指针又可以称为行指针,在2维数组中,其步长是一行元素的总长度;

  int a[3][4];

  int (*p)[4] = a; // 数组指针,指向一个具有4个元素的一维数组,现在p的指向的地址和a的首地址一样;

  p++; // 步长为sizeof(int) * 4,指向二维数组的下一行的地址,即&a[1];

 

例子:

 1 int a[][3] = {
 2         { 11, 12, 13 },
 3         { 21, 22, 23 },
 4         { 31, 32, 33 }
 5     };
 6     int b[] = { 41, 42, 43, 44 };
 7     
 8     int (*pa)[3] = a;
 9     int (*pb)[4] = &b;
10     int *pc = b;
11     int *pd[3];
12     pd[0] = a[0];
13     pd[1] = a[1];
14     pd[2] = b;
15     int **pe = (int**)(new char[sizeof(int*) * 2]);
16     pe[0] = a[0];
17     pe[1] = a[1];
18     *(pe + 2) = a[2];
19     
20

打印:

 1   printf("pa %p %p \n", *pa, *(pa + 1));
 2     printf("pa %d %d %d \n", **pa, **(pa + 1), *(*(pa + 1) + 2));
 3     printf("pb %p %p \n", *pb, *(pb + 1));
 4     printf("pb %d %d \n", **pb, **(pb + 1));
 5     printf("pc %p %p \n", pc, pc + 1);
 6     printf("pc %d %d \n", *pc, *(pc + 1));
 7     printf("pd %p %p %p %p \n", pd[0], pd[1], *(pd + 2), *(pd + 2) + 1);
 8     printf("pd %d %d %d %d \n", *pd[0], *(pd[1] + 1), **(pd + 2), *(*(pd + 2) + 1));
 9     printf("pe %p %p %p \n", pe[0], pe[1], *(pe + 2));
10     printf("pe %d %d %d \n", *pe[0], *(pe[1] + 1), *(*(pe + 2) + 1));
11 
12   pa 0x7fff5fbff7e0 0x7fff5fbff7ec 
13   pa 11 21 23 
14   pb 0x7fff5fbff7d0 0x7fff5fbff7e0 
15   pb 41 11 
16   pc 0x7fff5fbff7d0 0x7fff5fbff7d4 
17   pc 41 42 
18   pd 0x7fff5fbff7e0 0x7fff5fbff7ec 0x7fff5fbff7d0 0x7fff5fbff7d4 
19   pd 11 22 41 42 
20   pe 0x7fff5fbff7e0 0x7fff5fbff7ec 0x7fff5fbff7f8 
21   pe 11 22 32 

 

以上是关于C/C++中的指针数组和数组指针的主要内容,如果未能解决你的问题,请参考以下文章

C 代码中的 Java 数组

C语言【函数 数组 指针】利用指针求一维数组的数据元素之和

知识分享:C/C++函数返回二维数组指针

C/C++语言指针用法详解 指针和数组

一文搞懂数组指针和指针数组C/C++面试必备

一文搞懂数组指针和指针数组C/C++面试必备