1.指针的初始化
指针初始化目的就是让指针知道指向那个地址。第一种方法就是在声明指针的同时告诉指针指向的地址,第二中情况,不在声明指针的时候初始化,而是把地址直接赋值给指针变量。注意:不可以在指针不清楚指向地址的情况下给指针赋值(但是char p=0或者p=NULL除外,该语句表示指针为空)。
第一种方法:在指针定义的时候告诉指针指向的地址。
下面这样初始化就是错误的:
第二中情况:不在声明指针的时候初始化,而是把地址直接赋值给指针变量
不可以在指针不清楚指向地址的情况下给指针赋值(但是char p=0或者p=NULL除外,该语句表示指针为空)
2.指针的赋值
在指针的已经初始化的前提下(指针已经知道指向那个地址),有两种赋值方式:第一种方式就是给指针直接赋值,第二中方式就是将地址赋值给指针变量,可以将变量的地址赋值给指针变量,将数组的地址赋值给指针变量,可以将函数地址赋值给指针变量。
3.函数指针
1)函数指针的声明与初始化
就像某一数据变量的内存地址可以存储在相应的指针变量中一样,函数的首地址也以存储在某个函数指针变量里的。这样,我就可以通过这个函数指针变量来调用所指向的函数了。
在C系列语言中,任何一个变量,总是要先声明,之后才能使用的。函数的初始化和指针的初始化一样,把普通函数test(int a,int b),看成变量,把(*n)(int t,int q)看成指针就行。第一种是在声明的时候进行初始化。第二种是在声明后把函数地址赋值给指针。
第一种:在声明的同时初始化,和变量不同的是,下面两种方式都可以:
第二种:在声明后再初始化,下面两种方式都可以:
2)通过函数指针变量调用函数
testp的函数名与testfun函数指针都是一样的,即都是函数指针。testfun函数名是一个函数指针常量,它的地址不能改变(类似于常量指针),而testp是一个函数数指针变量,这是它们的关系。 但函数名调用如果都得如(*testfun)(int a,int b)书写与读起来都是不方便和不习惯的。所以C语言的设计者们才会设计成又可允许testfun这样调用。为统一起见,testp函数指针变量也可以testfun的形式来调用。但是他们之间的声明和初始化是不同的,按照之前的声明和初始化形式进行。
4.指针作为函数参数
调用函数的时候参数必须是地址,就是告诉指针指向的地址,相当于指针的初始化。
4.指针自加
1)首先说明一下printf("%d,%d",a,b),首先计算b,然后计算a,然后输出a,然后输出b。
2)下面程序的过程:
解释第三个printf的输出过程。
第一步:(q)++是对对指针指向的值加1,但是++只能在下次计算的时候起作用。
第二步:q++(由于++优先级高于,则q++与*(*q++)等效),经过第一步已经将第一个指针指向的值加1,所以输出的值为2,而此处的++是对指针的地址加1.指正在下次计算的时候生效。
第三步:q的指针的地址已经加1,因此输出的3,而此处++只能在下次计算的时候体现出来。
m=q++;是先把q赋值给m,然后再++,地址加1在下次计算的时候体现出来。