原创 指针与引用

2010-6-13 17:52 2186 9 9 分类: 软件与OS

http://hi.baidu.com/shiqiang_hx/blog/item/1ea69818cfccc0bc4bedbc1b.html


*”是乘法符号,它为二元运算。


*”放在指针定义中时,称为指针定义符,定义指向某类型的指针。


*”放在可执行语句中的指针之前,称为间接引用操作符,可获得由该指针指向的变量的内容。



1、指向常量的指针(常量指针)


在指针定义语句的类型前加const,表示指向的对象是常量。如:



const int a =78;


const int * pa = &a;


指向常量的指针只限制指针的间接访问操作,而不能规定指针指向值本身的操作规定性。


上例中,不能修改“a”的值,但却可以修改“pa”值,因为“a”和“*pa”是常量,而“pa”本身不是。


2、指针常量


在指针定义语句的指针名前加const,表示指针本身是常量。如:



int b =28;


int * const pb = &b;


和常量要求一样,常量指针在定义时必须初始化。可以对指针指向值进行操作,但却不能修改指针本身。上例中不能修改“pb”的指向,但却可以修改“b”和“*pb”的值。


3、指向常量的指针常量(常量指针常量)



const int c = 7;


const int * const pc = & c;


指向常量的指针常量必须在定义时进行初始化。“指针常量”和“指向常量的指针”均不允许修改其内容,在上例中,既不能修改“c”和“*pc”的值,也不能修改“pc”的值。


4、指向指针的指针。



int d="28";


int * pd= & d;


int * * ppd = & pd;


cout << d << "\t" << pd << "\t"<< *pd << "\t"<< ppd << "\t"<< *ppd << "\t"<< **ppd << endl;


运算以上代码后将得到以下内容:



28 0x00aaa 28 0x00bbb 0x00aaa 28


5void指针


void指针是空类型指针,它不指向任何类型,也就是说void指针仅仅是一个地址。所以空类型指针不能进行指针运算,也不能进行间接引用。


由于其他指针包含有地址信息,所以将其他指针的值赋给空指类型指针是合法的,所之,将空类型指针赋给其他指针则是不允许的,除非进行显式转换。




int e="78";


int * pt;


void *vpt;


void * vpt1;


pt=&e;


vpt=&e;


vpt1=pt;


cout << pt << "\t" << *pt << endl;


cout << (int *)vpt << "\t" << * (int *)vpt << endl;


cout << (int *)vpt1 << "\t" << * (int * )vpt1 << endl;


//注:加黑部分为显式类型转换,将“void*”型转为“int*”型



输出结果为:



0x00aaa 78


0x00aaa 78


0x00aaa 78


6NULL指针


NULL是空指针值,它不指向任何地方。例:



int * e = NULL;


7、函数指针


函数指针的定义为:



int (* func) (char a,char b);


在上例中,int为函数的返回类型;被括号括住的“*”和名字表示该名字是一个指针;后边的括号表示该指针变量是函数类型或函数指针,这里是函数指针。 因为“*”的优先级没有“()”大,所以如果“*”和名字没有被括号则定义的是返回值为指针的函数。


省略方括号“[]”的数组名是地址,省略括号“()”的函数也是地址,所以将省略了括号的函数名作为函数地址赋值给函数指针。



int fn(char x,char y);


int (*fp)(char a,char b);


fp=fn;



&”是位与运算符,它为二元运算。


&”放在引用定义中时,称为引用定义符,定义某变量的引用。


&”放在可执行语句中的指针之前,称为取地址操作符,可获变量的地址。


引用是别名,在建立引用时必须初始化。因为引用本身不是一种数据类型,定义引用在概念上不产生内存空间,所以在引用之上的引用不存在,而且,引用的指针指向哪里呢?所以没有引用的引用,也没有引用的指针。


例:



    int a="78";


    int * p = & a;


    int & b = a;


    int * & c = p; //指针引用


    int & d = * p;


    cout << b << "\t" << d << endl;


    cout << p << "\t" << *p << endl;


    cout << c << "\t" << *c << endl;


输出结果为:



78 78


0x00aa 78


0x00aa 78





PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条