111-C 언어 const 분석

const는 상수 변수를 정의하며 읽기 전용은 쓸 수 없습니다
. 1 기본 데이터 유형은 const에 투명합니다 .const int ca = 10, int에 해당합니다. const cb = 10,
2. 포인터에서 const는 직접 오른쪽을 수정하고 간접적입니다. 계산되지 않음
전송 됨 3. 권한, 동일 또는 감소 된 전송 권한, 그러나 증폭을 통과 할 수 없음
결론 : c 언어에서 const, 가장 중요한 함수 값은 수정되지 않음, 매개 변수 포인터가 const 앞에옵니다.

int main()
{
    
    
	int a = 10;
	int b = 20;
	const int ca = 10;//不能改
	int *p = &a;
	p = &b;
	//p = &ca;//error  假如合法  ,*p = 100;->ca=100
	const int *p2 = &ca;//ok
	//*p2 = 20;//error
	//int *const p3 = &ca;//error
	const int *p4 = &a;
	int *const p5 = &a;
	//p = p2;//error
	return 0;
}
//const 规则1
int main()
{
    
    
	int a = 10;//可读,可写
	printf("%d\n",a);//读
	a = 100;//写
	const int ca = 10;//常变量,只读
	printf("%d\n",ca);//读
	a = ca;//ca读
	//ca = 100;//error
	int const cb = 10;//完全等同ca
	//cb = 20;//error

	return 0;
}
//const 规则2
int main()
{
    
    
	int a = 10;
	int b = 20;
	int *p = &a;
	p = &b;//p,写
	*p = 100;//*p,写
	const int *cp1 = &a;
	//*cp1 = 100;//error
	cp1 = &b;//ok
	
	int const *cp2 = &a;//等同cp1(规则1)
	//*cp2 = 100;//error
	cp2 = &b;//ok

	int *const cp3 = &a;
	*cp3 = 100;//ok
	//cp3 = &b;//error
	
	const int *const cp4 = &a;//不使用
	//*cp4 = 100//error
	//cp4 = &b;//error
	
	 //a + b;

	return 0;
}

const 수정 된 데이터 유형은 상수 유형을 참조하며 상수 유형 변수 또는 객체의 값은 업데이트 할 수 없습니다.
const의 원래 목적은 미리 컴파일 된 명령어를 교체하고, 단점을 제거하고, 장점을 상속하는 것이 었습니다.

(1) 불변 인 const 상수를 정의 할 수 있습니다.
  예 : const int Max = 100; Max ++는 오류를 생성합니다.
(2) 유형 검사에 편리하므로 컴파일러가 처리 내용을 더 잘 이해하고 숨겨진 위험을 제거합니다.
  예 : void f (const int i) {…} 컴파일러는 i가 상수이고 수정이 허용되지 않음을 알게됩니다.
(3) 모호한 숫자의 출현을 피할 수 있으며 조정하는 것도 편리합니다. 매개 변수를 수정합니다. 매크로 정의와 마찬가지로 동일한 작업을 수행 할 수 있으며 변경하면 변경됩니다!
(4) 수정 된 내용을 보호하고 우발적 인 수정을 방지하며 프로그램의 견고성을 향상시킬 수 있습니다. 여전히 위의 예에서 i가 함수 본문에서 수정되면 컴파일러는 오류를보고합니다.
  예 : void f (const int i) {i = 10; // error!}
(5) 공간을 절약하고 불필요한 것을 피할 수 있습니다. 메모리 분포. 예 :
여기에 사진 설명 삽입
(6) 효율성 향상.
  컴파일러는 일반적으로 일반 const 상수에 대한 저장 공간을 할당하지 않지만 심볼 테이블에 저장하여 메모리를 저장하고 읽는 작업없이 컴파일 중에 상수로 만들어 매우 효율적입니다.

다음 코드는 const에 의해 수정되지 않습니다. 먼저 n의 주소를 p 포인터에 할당 한 다음 p를 20으로 역 참조한 다음 m의 주소를 p에 할당합니다. 이 코드는 괜찮습니다.

#include <stdio.h>
void test1()
{
    
    
	int n = 10;
	int m = 20;
	int * p = &n;
	*p = 20;
	p = &m;
}
int main()
{
    
    
	test1();

	return 0;
}

const 수정이 왼쪽에있는 경우 즉, const는 포인터 변수가 가리키는 내용을 수정하고 포인터를 수정할 수 없습니다. * p를 역 참조하고 20에 할당하면 컴파일러에서 오류를보고합니다. 그러나 포인터의 내용은 변경 될 수 있습니다. 즉, 변경 m 포인터 p에 주소가 주어지면 컴파일러는 오류를보고하지 않습니다.
여기에 사진 설명 삽입
여기에 사진 설명 삽입
const 수정이
오른쪽 에있을 때 즉 , const는 포인터 변수를 수정합니다. 즉 포인터 변수의 내용은 수정할 수 없습니다. 즉, 포인터 p에 m의 주소가 주어지면 컴파일러는 오류를보고하지만 포인터의 내용은 변경할 수 있습니다. * p가 역 참조되고 할당되면 20까지 컴파일러는 오류를보고합니다.
여기에 사진 설명 삽입
여기에 사진 설명 삽입
const가 포인터 변수를 수정하는
경우 : 1. const가 *의 왼쪽에있는 경우 포인터가 가리키는 내용을 포인터로 변경할 수 없도록 포인터가 가리키는 내용을 수정합니다. 그러나 포인터 변수 자체의 내용은 가변적입니다.
2. const가 *의 오른쪽에 있으면 포인터 변수 자체를 수정하여 포인터 변수의 내용은 수정할 수 없지만 포인터가 가리키는 내용은 포인터를 통해 변경할 수 있습니다.

당신이 경우
내용이 포인터가 수정할 수 없습니다 가리키는 것을 보장 할뿐만 아니라 포인터 변수 자체가 수정되지 않도록 다음과 같은 다음, 내용이 포인터와 포인터 변수 자체가 가리키는 수정 const를 사용합니다 :
여기에 사진 설명 삽입

추천

출처blog.csdn.net/LINZEYU666/article/details/111566479