要说明的几点注意事项:
- 指针的运算*p++与(*p)++是不一样的,运算符从右向左结合,所以,*p++是指针地址加1后取值,而(*p)++是先取指针p的值,然后值加1。
- 指针与一维数组,int a[3];int *p,既可以使用p=a也可以使用p = &a[0],两个是等价的,即a=&a[0]。
- 指针的类型。指针分为两部分,一个是其指向类型,另一个是其自身类型,如何判断一个指针的指向类型和其自身类型呐,举个例子:int *p = NULL;我定义了一个指针p,
判断是自身类型:
把指针变量遮住剩下的部分便是自身类型。上例中把p遮住剩下的int*便是其自身类型;
判断指针指向类型:
把指针变量和离其最近的*遮住后剩下的便是其指向类型,上例中int便是其指向类型。
- 指向常量的指针与常量指针的区别。首先两种指针的定义方式不一样,指向常量的指针定义:const int *p,常量指针定义:int *const p;这两个指针前一个指向const int类型,后一个指向int类型;其二,指向常量的指针不能改变直接改变其指向地址的值,但可以改变指向地址,如:
int a = 20;
int b = 10;
const int *p = &a;
//现在有个需求要把指针*p = 20;
//第一种,直接改变*p的值
*p = b;//因为其为指向常量的指针,所以第一种方式是错误的,编译不能通过
//第二种,改变p的指向,这个是可以使用的
p = &b;
常量指针一旦定义初始化好,其指向的地址和指向地址的值都不能再改变,就是上述的两种方式都不能使用。
指针和多维数组
上面关于指针与多维数组的介绍有部分有点小毛病,所在我在这在说明一下。
多维数组在内存中的存储:多维数组的行列存储只是他的逻辑上的位置关系,其在内存中其实还是一维数组。
其中a[0],a[1],a[2]代表行地址,他们之间有这样的关系
a[2] = a[1]+1,a[1] = a[0]+1,其中a[0] =a=&a[0][0]