F.R.I.D.A.Y.

배열은 수정 가능한데 포인터는 수정 불가? 본문

DEV/C C++

배열은 수정 가능한데 포인터는 수정 불가?

F.R.I.D.A.Y. 2018. 9. 25. 17:30
반응형

 

 

 

char str1[] = "abcdefg"; char *str2  = "abcdefg";

 

 가끔씩, 배열과 포인터를 혼동하는 사람들이 있어서.

 

 배열 str1은 문자열 "abcdefg"에서 각각의 문자를 수정할 수 있다. 그러나 포인터 str2 는 각각의 문자를 수정할 수 없다.

 

 사실, 굉장히 간단한건데 기본적인 프로그램의 구조를 몰라서 생기는 문제라고 생각한다.

 

 

 배열에서도, 포인터에서도 쌍따옴표로 묶은 문자열로 값을 초기화 할 수 있다. 그런데, 배열은 정확히 하면 초기화를 편하게 할 수 있도록 추가 문법을 제공한 것으로 볼 수 있다. 따라서 

 

char str1[] = { 'a','b','c','d','e','f','g','\0' };

 

 일일이 대입이 되기 때문에 변경이 가능하다. 그러나 포인터에 값을 대입하는 경우는 아래의 설명을 따른다.

 

 데이터 세그먼트(다음 문서 참고)에 우항의 값이 저장되고, 데이터 세그먼트에 저장된 값의 처음 메모리 주소를 포인터 변수 str2에 저장한다.

 따라서 str2는 상수를 가리키는 포인터가 되는 것이다.

 상수를 변경하려고 하니 문제가 발생할 수밖에

 

 그래서, 포인터 형식으로 문자열을 저장한 프로그램의 경우에는 배열로 일일이 대입시킨 코드보다 메모리를 더 잡아먹게 된다. 그러나 요즘같이 기본적으로 메모리를 4G, 8G씩 달고 나오는 시대인만큼 이정도의 메모리 낭비(?)는 개발상 편의를 위해 이해되어진다. 과거 32KB 64KB를 쓰던 시대에나 배열에 일일이 대입하는 형식을 이용했다. 그 때는 가용 메모리 자체가 작아서..

 

 이미지 간단설명

 

728x90
반응형

'DEV > C C++' 카테고리의 다른 글

MFC :: 화면 캡쳐(capture.exe)  (0) 2018.12.23
substr 직접 만들어보기  (0) 2018.11.14
삼항 연산자 ? :  (0) 2018.09.25
WINAPI - 2018 PU PROJECT  (0) 2018.09.19
Cpp 캐스팅  (0) 2018.06.20
Comments