版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
源码:
1 #include<stdio.h>
2
3 int main()
4 {
5 int a[4][4]=
6 {
7 1, 2, 3, 4,
8 5, 6, 7 ,8,
9 9, 10, 11, 12,
10 13, 14, 15, 16
11 };
12 int (*ps)[4]=a;
13
14
15 printf("\nps==%x\n", ps);
16 printf("\nps+1==%x\n", ps+1);
17 printf("\nps+2==%x\n", ps+2);
18 printf("\nps+3==%x\n", ps+3);
19
20
21 printf("\n(*ps)==%x\n", *ps);
22 printf("\n(*ps+1)==%x\n", *ps+1);
23
24 printf("\n*(ps)==%x\n", *(ps));
25 printf("\n*(ps+1)==%x\n", *(ps+1));
26 printf("\n*(ps+2)==%x\n", *(ps+2));
27 printf("\n*(ps+3)==%x\n", *(ps+3));
28
29
30 printf("\n**(ps+3)==%x\n", **(ps+3));
31 printf("\nps[0][2]==%x\n", ps[0][2]);
32 printf("\n*(ps+1)+3)==%x\n", *(ps+1)+3);
33 printf("\n*(*(ps+1)+3)==%x\n", *(*(ps+1)+3));
34 printf("\n*(ps+1))==%x\n", *(ps+1));
35 printf("\n\n");
36
37
38 printf("\n(*ps)==%x\n", *ps);
39 printf("\n(*ps)[0]==%x\n", (*ps)[0]);
40 printf("\n(*ps)[2]==%x\n", (*ps)[2]);
41
42 printf("\n(*ps)==%x\n", *ps);
43 printf("\n(*ps+0)[0]==%x\n", (*ps)[0]);
44 printf("\n(*ps+1)[2]==%x\n", (*ps)[2]);
45
46 printf("\n(*ps)==%x\n", *ps);
47 printf("\n(*(ps+1))[2]==%x\n", (*(ps+1))[2]);
48 printf("\n(*(ps+2))[2]==%x\n", (*(ps+2))[2]);
49
50
51
52
53 printf("\n(*ps)==%x\n", *ps);
54
55 printf("\nps==%x\n", ps);
56 printf("\n(ps+1)==%x\n", (ps+1));
57
58 printf("\n(ps+1)[0]==%x\n", (ps+1)[0]);
59 printf("\n((ps+1))[1]==%x\n", ((ps+1))[1]);
60 printf("\n((ps+1))[2]==%x\n", ((ps+1))[2]);
61
62
63 printf("\nps+2==%x\n", ps+2);
64
65 printf("\nps+3==%x\n", ps+3);
66
67
68
69
70
71 return 0;
72 }
输出:
[email protected]:~/test/test/test_str/test_ch/pointer/6.18_1$ ./a.out
ps==a29dbda0
ps+1==a29dbdb0
ps+2==a29dbdc0
ps+3==a29dbdd0
(*ps)==a29dbda0
(*ps+1)==a29dbda4
*(ps)==a29dbda0
*(ps+1)==a29dbdb0
*(ps+2)==a29dbdc0
*(ps+3)==a29dbdd0
**(ps+3)==d
ps[0][2]==3
*(ps+1)+3)==a29dbdbc
*(*(ps+1)+3)==8
*(ps+1))==a29dbdb0
(*ps)==a29dbda0
(*ps)[0]==1
(*ps)[2]==3
(*ps)==a29dbda0
(*ps+0)[0]==1
(*ps+1)[2]==3
(*ps)==a29dbda0
(*(ps+1))[2]==7
(*(ps+2))[2]==b
(*ps)==a29dbda0
ps==a29dbda0
(ps+1)==a29dbdb0
(ps+1)[0]==a29dbdb0
((ps+1))[1]==a29dbdc0
((ps+1))[2]==a29dbdd0
ps+2==a29dbdc0
ps+3==a29dbdd0
-------------分割线---------------------------------
总结:
二维数组中,
**p是对元素的引用, 包括 *(*(p+1)+2)之类的
*p和p的功能一样, 都是指向行首元素的指针, 保存行首元素的地址
在(*p)[0]中, (*p)指向行首, 然后[0]是取行首地址之后的下标,
也是对二维数组元素的引用, 类似功能, (*(ps+1))[2]
注意: ps+1为行首地址
(ps+1)和(ps+1)[0]都是指向行首元素的指针
(ps+1)[1]和ps+2 保存的地址一样的,
比如 (ps+1)[2]和ps+3 相等, 所以, 猜测ps加减移动指向行首将这个作为一维数组首地址,
然后取这个[2]的元素(他是个行首地址), 所以和ps+3是一摸一样的