1、使用为初始化的指针
int main(void){
//使用未初始化的指针
int *p;
printf("*p value: 0X%p\n",*p);
return 0;
}
2、将值当做地址赋值给指针
int main(void){
int *p;
int val = 10;
//将值赋给指针
p = val;
return 0;
}
3、忘记解引直接访问内存
int main(void){
int arr[10];
int *p1,*p2;
p1 = &arr[0];
p2 = &arr[1];
//判断数组两个元素的大小
if(p1>p2){
//内容永远不会被执行,因为比较的p1和p2的地址大小,p1永远小于p2
}
return 0;
}
4、再次使用忽略重新赋值
int main(void){
char arr[10];
char *p;
p = arr;
do{
gets(arr); //控制台获取一组字符
while(*p){
printf("arr's value: %c\n",*p++);
}
}while(strcmp(arr,"done")!=0);
return 0;
}
错误原因:指针p已经指向了数组中第七个元素字符串结束符“0\”,当下一次打印内容时,
如果输入内容长度小于原来的,指针p还是指向的结束符,从而无法打印内容
如果输入内容长度大于原来的,打印的内容也是显示不正确
解决方案:每次循环时给指针重新初始化
int main(void){
char arr[10];
char *p;
// p = arr;
do{
gets(arr); //控制台获取一组字符
p = arr; //每次循环进行初始化操作
while(*p){
printf("arr's value: %c\n",*p++);
}
}while(strcmp(arr,"done")!=0);
return 0;
}