문자, const

Yama·2023년 12월 14일
0

어소트락 수업

목록 보기
12/55

문자

  • 문자 == 정수
short s = 50;
short s2 = '2'
wchar_t wc = 50; 
wchar_t wc2 = '2';
char c = 61;
  • s의 50은 말그대로 숫자 50이다.
  • s2에 문자 '2'를 short로 해석하니까 50이 나온다.
  • wc의 50을 해석하면 문자'2'다.
  • wc2도 문자'2'로 해석한것.
  • 숫자61은 문자로 해석하면 '='다.

아스키 코드

  • abcdef를 문자로 쳤다하면 컴파일러는 97 98 99 100 101 102 103의 2진수로 해석한다

사진을 확장자명 .txt로 변경하면?

  • 확장자당 연결 프로그램이있다.
    • 사진확장자를 .txt로 바꿔버리면 메모장으로 연결된다.
  • 메모장은 사진을 해석하는 맞지 않은 방법으로 픽셀을 문자로 해석하니까 깨진문자 처럼 보인다.
  • 데이터를 문자라고 보면 프로그램은 나열되어있는 2진 데이터를 문자로 해석(아스키코드,유니코드)해서 보여주는것.

문자 배열

  • wchar_t을 사용할때는 문자 앞에 L을 붙여줘야한다.
	wchar_t name[10] = { L'1', L'2', L'3', }; 

	wchar_t name[10] = L"Hello";
	char name1[10] = "Hello";
    
    short sname[10] = { L'H', L'e', L'l', L'l', L'o' };
    //short ssname[10] = L"Hello" // 오류
    
    int p = sizeof(name);
	int p2 = sizeof(name1);
  • 문자 배열만 가능한 초기화법.
  • 크기

const * 타입

  • 주소를 저장하고, 접근(읽기)까지만 가능하다.
  • 원본 변수를 수정할 수 없다.
	int data = 0;
	int data2 = 100;
	const int* pData = &data;

	//*pData = 100; // 1
    
	int i = *pData; // 2
    
    pData = &data2; // 3
	// *pData = 200; // 4
  • //1은 원본 변수값을 수정하는거라 오류가 발생한다.
  • //2는 pData의 값을 가져오는거라 가능하다.
  • //3는 주소 저장하는거라 가능하다.
  • //4도 pData의 저장된 값을 바꿀려는거라 안된다.

* const 타입

	int* const pConst = nullptr; // 3
    int* const pConst = &data; // 3
	*pConst = 500; // 1
	//pConst = &data2; // 2
  • 원본 변수를 수정만 가능하다.
  • 초기의 초기화 주소만 가질수 있다, 접근(읽기)불가능.
  • //1 값 변경 가능
  • //2 주소값 변경 불가능.
  • //3 넣을 주소값 위치가 없는데 값을 넣을려해서 예외가 발생함..

const 키워드

	int value = 100; // 1
  • 상수?
	const int cvalue = 100; 
	// cvalue = 200; 
  • 변수를 상수화 한것.
  • 오류
    • 상수를 바꿀려고 했으므로 문법적으로 오류.

const 포인터..

	const int cvalue = 100;
 
   	int* pForce = (int*)&cvalue;
    
	*pForce = 200;
  • 강제 캐스팅해서 숫자 강제로 바꿔버리기
    • 컴파일러는 지역변수지만 상수로 변경해둔걸 포인터로 문법을 무효화해서 강제 캐스팅해서 의도적으로 const를 문법을 무시하고 숫자를 바꿔준것.

const 쓰는 이유?

struct object
{
	int const id;
	int hp;
	int mp;
};

int main()
{
	object a = { 10 };
	object b = { 11 };
	object c = { 12 };
    
    // 1
    a.id = 100;
    b.id = 2; 
    c.id = 3;
}
  • 개체가 한번 준 이후 값 변경 불가능하게할려고
    • 보안성 업.
  • // 1 id는 구조체안에서 const로 되있어서 변경하면 오류뜸.

포인터 변수 상수화

int main()
{
	int a = 0;
    int b = 0;
    
	int* const pInt = &a;
	*pInt = 100; 
    
	pInt = &b; // 오류
    return 0;
}
  • 포인터 변수 자체가 상수화됨
  • 주소 변경 불가(접근 불가).
int main()
{
	int a = 0;
    int b = 0;
    
	const int* pInt2 = &a;
	pInt2 = &b;
    
	*pInt2 = 100; // 오류 
    return 0;
}
  • 포인터로 원본을 수정하는 기능이 막힘.
  • 접근은 가능(주소변경가능).
int main()
{
	int a = 0;
    int b = 0;
    
	const int* const pInt3 = &a;
    
    return 0;
}
  • 한번 가리킨 대상을 다른 대상으로 변경할 수 없다.
  • 가리키고 있는 원본을 수정할 수도 없다.

const 무시하는 법

	const int* pForce = &cvalue;
	(int*)pForce = 200;
  • 이렇게 문법대로 하면 const무시 불가능
	int* pForce = (int*)&cvalue;
	*pForce = 200;
  • 무시방법 1
	const int* pForce1 = &cvalue;
	*((int*)pForce1) = 200;
  • 무시방법2

강의 코드

#include <iostream>

struct object
{
	const int id;
	int hp;
	int mp;
};


int main()
{
	short s = '2';
	wchar_t wc = '2';
	char c = 61;
	c = '\n';


	//wchar_t name[10] = {L'1', L'2', L'3', };
	wchar_t name[10] = L"Hello"; // 해당 방식의 초기화는 wchar_t 만 가능
	short   sname[10] = { L'H', L'e' , L'l', L'l', L'o' };

	char cName[10] = "Hello";

	const char* pString = "abcdef";

	int data = 20;
	int data2 = 100;

	const int* pData = &data;

	int i = *pData;
	//*pData = 200;

	pData = &data2;
	//*pData = 200;

	int* const pConst = &data;
	*pConst = 500;
	//pConst = &data2;


	int value = 100;

	const int cvalue = 100;
	//cvalue = 200;

	//const int* pForce = &cvalue;
	//(int*)pForce = 200;

	int* pForce = (int*)&cvalue;
	*pForce = 200;

	const int* pForce1 = &cvalue;
	*((int*)pForce1) = 200;




	{
		object a = { 10 };
		object b = { 11 };
		object c = { 12 };

		/*a.id = 100;
		b.id = 2;
		c.id = 9;*/
	}

	{
		int a = 0;
		int b = 0;

		int* const pInt = &a;
		*pInt = 100;
		//pInt = &b;

		const int* pInt2 = &a;
		pInt2 = &b;
		//*pInt2 = 100;

		const int* const pInt3 = &a;
	}

	return 0;
}

1차 23.12.14
2차 23.12.15
3차 23.12.17
4차 23.12.18
5차 23.12.19
6차 23.12.25
7차 24.01.01
8차 24.01.24

0개의 댓글