关于指针,我们需要根据各种类型来分析。
| int p | 这是一个普通的整型变量 |
| int *p | p是一个返回整型数据的指针 |
| int p[0] | p是一个由整型数据组成的数组 |
| int *p[0] | p是一个由返回整型数据的指针所组成的数组 |
| int (*p)[0] | p是一个指向由整型数据组成的数组的指针 |
| int **p | 二级指针 |
| int p(int) | 函数的返回值是一个整型数据 |
| int (*p)(int) | p是一个指向有一个整型参数且返回类型为整型的函数的指针 |
了解这些指针就足够了。
1.2指针详细了解指针主要需要搞清楚它的四个方面的内容
1.指针的类型
2.指针所指向的类型
3.指针的值
4.指针本身所占据的内存区
1.2.1指针的类型有一个简便的方法,我们将声明语句中的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身具备的类型。
- int *ptr : 指针的类型是int *
- char *ptr :指针的类型是 char *
- int **ptr : 指针的类型是 int **
- int (*ptr)[3]: 指针的类型就是 int(*)[3]
- int *(*ptr)[3]: 指针的类型就是 int*(*)[3]
这个和大体上面相同,但是主要是要把声明变量前的*一起去掉。
- int *ptr :指针所指向的类型就是Int
- int **oto : 指针所指向的类型就是Int*
分清这两个的关系能对我们的指针掌握有具体的帮助。
1.2.3指针的值指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32 位程序里,所有类型的指针的值都是一个32 位整数,因为32 位程序里内存地址全都是32 位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为si zeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX 为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。
1.2.4指针本身所占据的内存区直接使用sizeof()测一下就OK!



