001 指针的基本使用
//指针的基本使用:
int a, *m; // 1)声明一个int类型指针;
a=1;
m= &(a); // 2)变量a的地址赋值给m,即指针指向变量a
int *n = &a ; // 直接定义指针n获得a的地址;
*m =10; // 3)指针m指向变量a赋值为10。间接访问符,没有声明变量时,*是间接访问运算符,当作其指向的的变量用。
*m= *m +1;
++ *m; //都是二级,从右向左,先算*m=a; 然后++a
*(m) ++; //()是一级,从左到右,先算*m=a, 然后a++
*m++ // 都是二级,从右向左,先算m++,地址加一,指向下一个字节,然后算*m, 很可能取出一个错误的值;
- 解释:
- 1)1. 变量声明 int * p; char * m 本质都是开辟了一块int大小的字节块,用于存放地址; 不同类型指针差别在于*p *m间接访问运算时取出字节块大小不一,因此可能出现指针值相同,但取出值不同(不同类型指针);
- 2)p = xxx, 赋值的时候当作一个存放地址的int变量。
- 3)*p= xxx, 赋值的时候当作背后指代的变量使用;
- struct Engine * p = (struct Engine * ) (m); 强制转换后,p和m的值相同(指向地址相同),但是*p, *m不同(指向数据不同)。
002 指针的强制类型转换(1,2)
/指针的强制类型转换1:
struct Engine*pEngine = (struct Engine*) calloc(1, sizeof(strcut(Engine)));
///等价于:
int *m ;
struct Engine*pEngine; //1)
m= calloc(1, sizeof(strcut(Engine))); // 2)
pEngine = (struct Engine*) m; //3)
- 解释:
- 这句话进行指针的强制类型转换,分别干了三件事情
- 1)struct Engine*pEngine; 声明一个Engine结构体类型的变量;
- 2) 调用calloc在动态内存中开辟一块struct大小的字节块,并返回字节块首地址;
- 3)将返回的首地址进行强制类型转换,转化为struct类型的指针;
- 指针的强制类型转换2
/指针的强制类型转换2:
int * m;
struct Engine *pEngine = (struct Engine *) (m); // 指针强制类型转换,int *m → struct Engine * p,两个不同类型的的值相同
///等价于:
struct Engine *pEngine; //1)声明Engine结构体类型指针;
pEngine = (struct Engine *) (m);// int指针m强制转化为Engine结构体指针
- 解释:
- 相比上一个强制类型转换,稍微简单一点,包含两步:
- 1)struct Engine*pEngine; 声明一个Engine结构体类型的变量;
- 2) int指针m强制转化为Engine结构体指针
|