1、要区分指针的类型和指针所指向的类型
1.1指针的类型:把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。
eg: int *a;去掉‘a’,得到“int *”,所以该指针的类型就是int *,即该指针是一个指向整型变量的指针;
char *str;去掉“str”,得到"char *",所以该指针的类型就是char *,即该指针是一个指向char型变量的指针;
int **ptr;去掉“ptr”,得到“int **”,故改指针的类型就是“int **,即该指针是一个指向整型指针变量的指针”
int (*ptr)[3];去掉“ptr”,得到“int(*)[3]”,故改指针的类型就是int(*)[3],即该指针是一个指向整型数组的指针。
1.2指针所指向的类型:把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。
eg:int *a;去掉‘a’和‘*’,得到“int”,故该指针所指向的类型是int型;
char *str;去掉“str”和‘*’,得到“char”,故该指正指向的类型是char型;
int **ptr;去掉“ptr”和‘*’,得到“int *”,故该指针指向的类型是int *型;
int (*ptr)[3];去掉“ptr”和‘*’,得到int [3],故该指针指向的是int [3]型。
2、要理解‘*’在不同场合的不同意义
1 void main() 2 { 3 int *a; 4 int b=10; 5 6 a=&b; 7 8 printf(”%d“,*a); 9 }
第3行int *a(定义的时候)‘*’只是表示此时定义的这个变量是指针变量
第8行中的*a,其中的‘*’表示”指向“,”*a“表示指针变量a所指向的变量,也就是b;
3、不能给野指针瞎赋值
eg:
1 void swap(int *a,int *b) 2 { 3 int *temp; 4 *temp=*p1; 5 *p1=*p2; 6 *p2=*temp; 7 }
第3行定义了一个指向整型变量的指针temp,接下来在第4行就给*temp赋值。这是错误的。
因为*temp是指针temp所指向的变量,但是由于未给temp赋值,所以temp并没有确定的值,所以temp所指向的内存单元也就是不可预见的。那么对*temp赋值就是向一个未知的存储单元赋值,但是这个未知的存储单元有可能是一个存放着重要数据的单元,这样就会造成系统运行错误。
原文:http://www.cnblogs.com/wan0807/p/4707420.html