C++指针注意事项
1、指针变量为什么必须指定基类型?
答:因为不同类型的数据在计算机系统中的存储方式和所占的字节数是不相同的,将一个变量的地址赋给一个指针变量,其实是将这个变量所占内存空间的首地址赋给指针变量,只有知道该数据的类型,才能按照存储单元的长度以及数据的存储形式正确的读取该数据。
2、指针做形参本质?
答:无论什么做形参,调用函数时不会改变实参指针变量的值,但可以改变实参指针变量所指向变量的值。
3、指针和数组潜规则?
答:在C++编译系统中将形参数组名一律作为指针变量来处理,用数组名作函数的参数,传递的是数组首元素的地址。数组名代表数组首元素的地址。指针变量P是被定义为指向整形的对象,它可以指向整形的数组元素,也可以指向数组以后的内存单元。eg:
int a[10]; int *p=a; //指针变量P的初值为&a[0] cout << *(P+10); //要输出a[10]的值,虽合法但不推荐
4、函数指针:指向函数的指针。int (*P)(int ,int)//定义指向一个函数的指针变量;作用:可通过指针来访问函数
指针函数:返回指针值的函数。int *max(int x,int y) //定义一个返回值是指针的函数。 ;作用:返回值是指针(指针能干的事都可以干)
指针数组:数组里的元素都是指针。int *P[5] //定义了一个指针数组,大小为5,数组名为P;作用:数组的每个元素都是一个指针变量,都可以指向int型变量。
eg. char *name[]={"BASIC","FORTRAN","C++","PASCAL"}; //定义了一个指针数组,起数组的值是每个字符串的起始地址
5、指向指针的指针:char *(*p); //和 char **p等价
char *name[]={"BASIC","FORTRAN","C++","PASCAL"}; //定义了一个指针数组,起数组的值是每个字符串的起始地址 char **P; p=name+2; // P指向name数组的第三个元素,即“C++“字符串的首地址;则*P的输出结果是:C++; **P的输出结果是:C
6、void 指针类型。其实可以把void当做char 、int、等基本数据类型处理即可。定义一个基类型为void 的指针变量:(void *)
eg:
int a=3; int *p1=&a; void *P; p=(void *)p1; //将p1的值强制转换为void * 类型 cout << *(int*)p<<end;//强制转换为int *型,然后解引用,即输出a的值3
总结:有关指针的数据类型
变量定义 | 类型表示 | 含义 |
int *p | int * | 定义P为指向整形数据的指针变量 |
int *p[4] | int * [4] | 定义指针数组P,它由四个指向整形数据的指针元素组成 |
int (*P)[4] | int (*)[4] | P为指向包含4个元素的一维数组的指针变量,p相当于数组的首地址 |
int f() | int() | f为返回整形函数值的函数 |
int *p() | int *() | p为返回一个指针的函数,返回值是指向int型的指针,p是函数 |
int (*p)() | int (*)() | p为指向函数的指针,该函数返回值是int型 |
void *p | void * | P是一个指针变量,基类型为void,不指向具体的对象 |
const int *P | const int * | p是一个指向常量的指针变量,不能通过P改变其指向的对象的值 |
int const *p | int const * | p是常量指针,其值不变,但指向的对象可变 |
int **P | int ** | p是一个指针变量,它指向一个指向int型数据的指针变量 |