1. 数据类型和*作为一个整体:

int *p1 和(int *)p1//指针强制类型转换  

2. 不同类型指针需进行强制类型转换才可以相互赋值:

float *p1;  
int *p2;  
p1 = (float *)p2;//注意*放在括号里面 

3. 任何类型的指针都可以赋值给void类型的指针:

void *p1;  
int *p2;  
p1 = p2;  

4. 如果函数的参数可以是任意类型指针,那么应声明其参数为void *

5. 用一元运算符*来返回指针所指变量的值

6. 指针偏移量:

一个指针加一就是指针地址加上指针对应数据类型的长度,如:
int *p; p+1就是p的地址加4

指针存储的就是对应数据的储存单元(一个字节Byte大小)的地址

[]运算符的优先级高于*运算符,故在定义指针变量的时候要区分int (*p)[4] 和 int *p[4],前者括号中的*表明p是一个指针变量,指针类型为int [4],就是4个int类型的整体,也就是4个int的数组数据类型。而后者是一个指针数组

7. 单独使用指针的语义:

需要注意的是,C语言中表达式中单独使用一组数据没有实际的意义,编译器会将其转换为指向这组数据第0个元素的地址。如int (*p)[4]; *(p)+1; 其中*(p)表示的是p所指数组的第0个元素的地址,*(p)+1则是表示这个数组第1个元素的地址