C++指针常见错误

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;
}

正确截图

猜你喜欢

转载自blog.csdn.net/jjswift/article/details/112730145