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
5、void指针
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
6、NULL指针
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
文章评论(0条评论)
登录后参与讨论