第七章 指针

君子和而不同,小人同而不合

指针初探

  1. 定义一个指针

int *pnumber; // 也可以 int *pnumber;

两种定义的方式是一样的,最好坚持使用一种方式,不要混着用

指针的声明没有什么特别之处。可以用相同的语句声明一般的变量和指针:

double value, *pVal, fnum;

由此,在定义指针的时候尽量让 * 跟着变量名

下面容易引起误解

int *p, q;

上面这条语句声明了两个变量:指针 p 和 整型变量 q ; 而不是p和q都是指针

  1. 初始化指针

如果用已声明的变量地址初始化pointer变量,可以使用寻址运算符&

int number = 99;

int *pnumber = &number;

未初始化的指针是非常危险的,在使用指针的时候要对其进行初始化

int *pnumber = NULL;

  1. 通过指针访问值

使用间接运算符*可以访问指针所指的变量值,这个运算符也称之为取消引用运算符

int number = 15;

int *pointer = &number;

int result;

result = *pointer + 5;

printf(“%d”, result);

  1. 取指运算符的运算顺序

看下面的这个例子:

int num = 5;

int *p = #

++*p; //运行后num=6

(*p)++ //运行后num=7

上面的例子中第三行++*p不需要加括号,因为++*是同级运算符,同级运算符从后往前运算不需要添加括号怕

而(*p)++如果不添加括号的话就会变成是指针加一然后取值。

为了避免错误,不管++在前面还是在后面都加上括号。

  1. 指向常量的指针

声明指针时,可以使用const关键字指定,该指针指向的值不能改变,下面是声明const指针的例子:

long value = 9999L;

const long *pvalue = &value;

下面的语句会导致错误:

*pvalue = 8888L;

pvalue指向的值不能改变,但是可以对value的值进行任意操作。

value = 7777L;

改变了pvalue的值,但是不能使用pvalue指针做这个改变,指针本身也不是常量,可以改变指针中存储的地址,但是不允许使用指针改变它指向的值。

==就很无语,怎么会有这样的设计==

  1. 常量指针

下面的语句可以使指针总是指向相同的对象:

int count = 43;

int *const pcount = &count; //定义一个常量指针

该指针存储的地址不能改变

int item = 34;

pcount = &item // 会报错

但是使用pcount, 仍然可以改变pcount的值:

*pcount = 345;

还可以直接使用count改变这个值

还可以创建一个常量指针,指向一个常量值

int item = 25;

const int *const pitem = &item;

pitem 是一个指向常量的指针,所有的信息都是固定不变的。

  1. 指针的命名

当程序写的相当大了,很难记住哪个是一般变量,哪个是指针,最好将P作为指针名的第一个字母

==待更==