1.指针的算术运算
char a[20];
int *ptr=(int *)a; //强制类型转换并不会改变a 的类型
ptr++;
指针ptr 的值加上了sizeof(int),由于地址是用字节做单位的,故ptr 所指向的地址由原来的变量a 的地址向高地址方向增加了4 个字节。
2.&和*
这里&是取地址运算符,*是间接运算符。
&a 的运算结果是一个指针,指针的类型是a 的类型加个*,指针所指向的类型是a 的类型,指针所指向的地址是a 的地址。
*p 的结果是p 所指向的东西,它的类型是p 指向的类型,它所占用的地址是p所指向的地址。
3.数组和指针
int b[10];
b[4] = 3;
找到符号b,然后发现其类型为int[](假想表达方式,C语言中不支持这样写),所以计算式变成了0x1008+4×sizeof(int)=0x1018,然后把3放入0x1018就可以了。用一个式子表达就是*(0x1008+4)=3。
4.指针和结构类型
struct MyStruct
{
int a;
int b;
int c;
};
//声明了结构对象ss,并把ss 的成员初始化为20,30 和40。
struct MyStruct ss={20,30,40};
//声明了一个指向结构对象ss 的指针。它的类型是MyStruct *,它指向的类型是MyStruct。
struct MyStruct *ptr=&ss;
//声明了一个指向结构对象ss 的指针。但是pstr 和它被指向的类型ptr 是不同的。
int *pstr=(int*)&ss;
ptr->a; //指向运算符,或者可以这们(*ptr).a,建议使用前者
ptr->b;
ptr->c;
*pstr; //访问了ss 的成员a。
*(pstr+1); //访问了ss 的成员b。
*(pstr+2) //访问了ss 的成员c。
5.指针和函数的关系
把一个指针声明成为一个指向函数的指针。
int fun1(char *,int);
int (*pfun1)(char *,int);
pfun1=fun1;
int a=(*pfun1)("abcdefg",7); //通过函数指针调用函数。
6.指针类型转换
强制类型转换p=(int*)&f;