指针的类型和指针所指向的类型:
- 指针的类型是定义指针名字之后剩余的部分
- 指针所指向的类型是定义指针后,去掉一个*和指针名字的部分
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++编译器在排列数组的单元时,总是把各个数组单元存放在连续的存储区里,单元和单元之间没有空隙。但在存放结构对象的各个成员时,在某种编译环境下,可能会需要字对齐或双字对齐或者是别的什么对齐,需要在相邻两个成员之间加若干个“填充字节”,这就导致各个成员之间可能会有若干个字节的空隙。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END