赋值:可以把一个地址赋给一个指针。取地址:&
取值:运算符 * 可取出指针指向地址中存储的数值
声明:
- 一维数组:int (* pz) [2]; //pz 指向一个包含2个int值的数组,必须加括号,因为 [] 的优先级高于 * 。错误形式:int * pz[2],会先生成pz[2],再生成 * ,pz表示由两个指向int值的指针构成的数组
- 多维数组:int zippo[2][2] = {{1, 2},{3, 4}}; int(* pz) [2]; pz = zippo;
不能对未初始化的指针取值。(very dangerous) 当创建一个指针时,系统只分配了用来存储指针本身的内存空间,并不分配用来存储数据的内存空间。
关于数组:通常我们进行变量传递时,直接传递数值;只有需要在函数中修改该值时,我们才传递指针。对于处理数组的函数,只能传递指针,原因是只有这样能使程序效率更高。如果设计意图是函数不改变数组的说内容,那么可以在函数原型和定义的形式参量声明中使用关键字const。如:int sum(const int ar[], int n); /*原型*/ int sum (const int ar[], int n) {...} /*定义*/ 使用const可以对数组提供保护,就行按值传递可以对基本类型进行保护一样,可阻止函数修改调用函数中的数据。
关于const的补充:
使用const不仅可以创建符号常量,还可以创建数组常量、指针常量以及指向常量的指针。如
- const double PI = 3.141592; /* PI 不能再被修改*/
- const int day[MONTHS] = {31, 28, 31, 30, 31, 30, 31, 31,30, 31,30,31}; /*数组的值不能再被修改*/
- doubles rates[3] = {2 , 3, 4}; const double * pd = rates;/* pd 指向数组开始处,这样就不能使用pd来修改它所指向的数值。如*pd =4; pd[2] = 7;都是不允许的。但是仍然可以使用rates来修改其数值。 另外,可以让pd指向其他的地址,如:pd++,使*pd指向rates[1]*//*从“这一切都是为了保护数据”的角度去理解也许更容易*/
关于指针赋值和const
- 将常量或非常量数据的地址赋给指向常量的指针是合法的。然而只有非常量的数据地址才能赋给普通的指针。
- 可以使用const来声明并初始化指针,以保证指针不会指向别处。关键在于指针的位置:
double rates [5] = { 1, 2, 3, 4, 5 }; double * const pd = rates; //pc指向数组开始处 pc = &rates[2] //不允许 *pc = 9; //可以,更改rates[0]的值
3.使用两个const来创建指针,既不可改变指针的指向,也不可改变指针所指向的数值。
double rates [5] = { 1, 2, 3, 4, 5 };
double const * const pd = rates; //pc指向数组开始处,前一个const的作用结果为不可改变指针所指向的数值,后一个const的作用结果为不可改变指针指向的地址
pc = &rates[2] //不允许
*pc = 9; //可以,更改rates[0]的值