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 \"の7番目の端にある配列要素を指すポインタがあります。
入力が元のコンテンツの長さより短い場合は次回印刷するか、ポインタ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