今天的C++实验课上的实验之一是调试并运行程序,然后分析结果。继续关于指针和数组的复习。通过该实验,我对于指针又有了更进一步的理解。下面我们就来看一下,对于指针的理解,都写在了程序的注释部分了。我自己的总结就是,看到指针时,先看看这是几维的,然后分清楚+1是对第几维做的,再然后看好*是对哪一部分进行降维操作的,最后看看是输出的地址还是值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream.h>
int a[][3]={1,2,3,4,5,6,7,8,9};
int *p[]={a[0],a[1],a[2]};
int **pp=p;
void main()
{
int (*s)[3]=a,*q=&a[0][0];
for(int i(1);i<3;i++)
for(int j(0);j<2;j++)
{
cout<<*(a[i]+j)<<','<<*(*(p+i)+j)<<','<<(*(pp+i))[j]<<',';
cout<<*(q+3*i+j)<<','<<*(*s+3*i+j)<<endl;
}

cout<<*s<<','<<s[0]<<endl;
}

/*
(1)运行结果分析
4,4,4,4,4
5,5,5,5,5
7,7,7,7,7
8,8,8,8,8
Press any key to continue
*(a[i]+j)表示第i+1+j行第一列元素
*(*(p+i)+j):p是二级指针,p+i表示第i行地址,也是二级指针,通过*降维,然后加j表示第i行第j+1列元素地址,再用*降维
(*(pp+i))[j]:(*(pp+i))的效果其实就是a[i],
*(q+3*i+j):q是一维指针,所以该式表示的是从q指向的元素向后移动3*i+j个元素
*(*s+3*i+j):s和p是一样的,*s表示的是一个一维的数组的首地址,即*s和q是等价的。

(3)
a[0]+1表示的是第一行第二列的元素的地址,因为a[0]是一个一维的指针,即a[0]表示的是从数组的第一个元素开始的一个一维数组的首地址
*(p+1)+1表示第二行第二列元素的地址,因为p是二维指针,p+1表示的是二维中的第一维加一,即p+1表示的是第二行元素,通过*进行降维后再加一即为第二列的元素地址
*(pp+1)[1]表示第二行第二列元素
q+3表示第四个元素的地址,即4的地址
*s+3表示第4个元素的地址

(4)
p是指针数组,s是指向数组的指针。p[]是一个数组空间的,只不过这个数组的每个空间是用来存储的地址的,而s是一个指针,指向的是一个数组空间。

*/