- 指针数组
定义: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
- 数组指针:
定义: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
原文链接: https://www.cnblogs.com/iRidescent-ZONE/p/5584026.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/235188
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!