C++指针

·  阅读 160

指针的类型指针所指向的类型

  • 指针的类型是定义指针名字之后剩余的部分
  • 指针所指向的类型是定义指针后,去掉一个*和指针名字的部分
int *ptr; //指针的类型是int *  
char *ptr; //指针的类型是char *  
int **ptr; //指针的类型是 int **  
int (*ptr)[3]; //指针的类型是 int(*)[3]  
int *(*ptr)[4]; //指针的类型是 int *(*)[4]  

int *ptr; //指针所指向的类型是int  
char *ptr; //指针所指向的的类型是char  
int **ptr; //指针所指向的的类型是 int *  
int (*ptr)[3]; //指针所指向的的类型是 int()[3]  
int *(*ptr)[4]; //指针所指向的的类型是 int *()[4]  
复制代码

指针里存的指:是一个地址,根据计算机的位数不同长度不同
&是一个取地址运算,*是一个取值运算

int *p;
int a=10;
p=&a;//p是指针变量名,赋给一个地址值
复制代码

数组名其实也是一个指针

int arr1[3]={1,2,3};
//获取arr1[0],arr1[1]的数值
*arr1;
*(arr1+1);
复制代码

结构体和指针的关系

Struct MyStruct  
{  
int a;  
int b;  
int c;  
}  

MyStruct ss={20,30,40};//声明了结构对象ss,并把ss的三个成员初始化为20,30和40。
MyStruct *ptr=&ss;//声明了一个指向结构对象ss的指针。它的类型是
MyStruct*,它指向的类型是MyStruct。
int *pstr=(int*)&ss;//声明了一个指向结构对象ss的指针。但是它的类型和它指向的类型和ptr是不同的。

请问怎样通过指针ptr来访问ss的三个成员变量?  
答案:  
ptr->a;  
ptr->b;  
ptr->c;  


又请问怎样通过指针pstr来访问ss的三个成员变量?  
答案:  
*pstr;//访问了ss的成员a。  
*(pstr+1);//访问了ss的成员b。  
*(pstr+2)//访问了ss的成员c。 
复制代码

但是采用第二种方式访问结构体成员是有风险的,数组能够这么用是因为数组是开辟的连续内存,而结构体就不一定了。所有的C/C++编译器在排列数组的单元时,总是把各个数组单元存放在连续的存储区里,单元和单元之间没有空隙。但在存放结构对象的各个成员时,在某种编译环境下,可能会需要字对齐或双字对齐或者是别的什么对齐,需要在相邻两个成员之间加若干个“填充字节”,这就导致各个成员之间可能会有若干个字节的空隙。

分类:
后端
标签: