• CSE207 객체지향 강좌 및 C++ 관련, 누구나 묻고 답하는 게시판 입니다.
  • CSE207 수강생이 아니여도 편안하게 질문하세요.
  • 첨부화일은 이미지 화일 혹은 zip 화일로 업로드 하기를 권합니다.

제목연산은 동일하나 메모리 속은 전혀 다릅니다2019-04-10 23:13
작성자 Level 10

1. 

동작면에서는 비슷해 보이지만, 엄연히 둘은 다릅니다.

배열의 이름은, 그 배열을 구성하는 첫번째 Element의 주소 값입니다.

따라서 배열이 만들어 질때, 배열의 시작지점에 대한 주소값을 배열의 이름으로 사용하는 셈이지요.

주소값을 저장하기 위한 별도의 공간은 필요가 없기에, 

본인이 제시한 예제 기준으로 배열 a의 크기는 정수 6개의 크기이고, 주소값 저장을 위한 별도 공간은 없습니다.

sizeof(a+0)의 크기가 8바이트로 나오는 것은 a+0가 주소 값이라는 상징적인 의미일 뿐,

실제 a+0의 값을 저장하는 공간은 없습니다.

그러나,,,, int *p란 p라는 메모리 공간을 점유하며, 이의 크기는 “*”의 포인터로 정의되므로 주소값의 크기입니다.

따라서 p라는 이름의 메모리 공간을 주소값을 저장할 만큼 점유하는 겁니다.

결론적으로 배열의 이름을 쓰나 포인터 변수를 쓰나 포인터 연산은 동일한 형태로 합니다.

그러나 배열의 이름은 (주소를 저장할) 별도의 공간이 없으나, 포인터 변수는 공간을 점유합니다.

배열의 이름은 해당 배열의 주소만 가르키지만, 포인터 변수는 말그대로 변수이기에 다른 공간을 가르킬 수 있습니다.


노파심에~ int *p는 p라는 이름으로 메모리 공간을 잡되, *로 주소를 저장한다는 의미이며, 

int는 “주소값으로 가르키는” 메모리 공간의 정보를 int로 취급한다는 의미입니다.


2.

과거 C의 철학은 “프로그래머가 원하는 대로 왠만하면 해줘라, 어차피 본인이 책임질테니”입니다.

C++에도 이런 정신은 이어 졌으며, 잡은 배열의 크기를 넘어서는 경우는 에러 없이 원하는 대로 합니다.

즉, 의미 없는 공간을 가르킨 것으로, 0이 나온건 우연일뿐, 그냥 가르키는 곳의 값을 가져옵니다.

만약 엉뚱한 곳을 가르킨후 write를 했다간, 무슨 일이 벌어질지 종잡을수 없습니다.

이를 방지하고자 STL을 통한 접근에서는 out of range 에러를 내주고 있기에, 사용을 권장하는 겁니다.


결국 최신의 Modern C++의 철학에서는 int, float, char[] 등의 원초적인 데이타 타입보다는

STL을 사용해서, Python 등 최신 언어들처럼 편하고 안전하게 프로그래밍 하기를 권합니다.

댓글
이전c++에서 array와 pointer2019-04-09
다음ifstream과 ofstream질문입니다2019-04-03