본문 바로가기
C++/기초

C++ 기초 : 포인터 문제 풀이와 해답

글: 시플마 2024. 3. 30.

포인터 관련하여 두 가지 문제를 풀어 봅시다.

 

먼저 첫 번째 문제를 풀어 보죠.

 

 

short형 배열 sArr이 선언되었고 각 칸에 1 ~ 10의 숫자가 들어 있습니다.

 

해당 배열의 주소를 int형 포인터 변수 pI에 강제로 형변환하여 저장합니다.

 

그림으로 나타내면

 

위와 같은 상황입니다.

 

각 칸마다 주솟값의 차이가 2씩 나는 이유는

해당 배열이 short형이므로

각 칸의 크기는 2Byte이기 때문입니다.

 

 

이 상태에서 괄호 안의 내용을 먼저 연산합니다.

pI + 2부터 연산해야겠죠? 연산하면

 

위 그림처럼 됩니다.

 

pI는 int형 포인터 변수이기 때문에 4Byte씩 읽을 것입니다.

그래서 pI에 2를 더하면 4Byte + 4Byte = 8Byte만큼 건너가

1008번지의 주소를 저장하게 됩니다.

 

그리고 이를 다시 short형 포인터 변수로 강제로 변환합니다.

다시 short형 포인터 변수로 바꾸는 이유가 무엇일까요?

 

short형 포인터 변수로

바꾸지 않고 그냥 넣으려고 하면 

 

위 그림처럼 두 칸을 인식할 것입니다.

 

왜냐하면 포인터 변수 pI는 int형이기 때문에 

*를 붙여 해당 주소로 가 값을 인식할 때

4Byte로 인식합니다. 그래서 short형 배열을

인식하려고 하면 2Byte짜리 칸을 두 개 읽고

iData에 넣으려고 하겠죠.

 

그래서 아래와 같이

 

short형 포인터 변수로 바꾼 후

*를 붙여 해당 주소로 가

2Byte인 한 칸만 인식하여 값을 얻고

iData에 넣는 것입니다.

 

 

따라서 1번 문제의 정답은 '5'입니다.

 

 

 


 

 

 

2번 문제를 풀어 보도록 하죠.

 

2칸짜리 char형 배열 cArr을 선언하였고

각 칸에는 1이 들어 있습니다.

 

short형 포인터 변수 pS에

배열 cArr의 시작 주소를 저장하였습니다.

 

여기까지의 상황을 그림으로 보면

 

위 그림과 같습니다.

 

여기서 pS에 *를 붙여 해당 주소로 간 후,

값을 얻어 iData에 넣습니다.

 

pS에 저장된 주소가 1000이므로

iData에 1이 대입되었을까요?

 

그렇지 않습니다.

 

이유는 pS는 short형 포인터 변수이기 때문에

*을 붙여 해당 주소로 가 값을 인식하려고 하면

2Byte씩 인식합니다.

 

아래 그림처럼 인식하는 것이죠.

 

자, 근데 여기서 해당 배열은 char형 배열입니다.

칸마다의 크기가 1Byte, 즉 8Bit라는 것이죠.

 

조금 더 그림으로 풀어서 보면

 

위 그림처럼 인식하는 것입니다.

저렇게 인식한 상태에서 값을 얻으면

0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1,

즉 10진수로 표현하면 257입니다.

(1000번지의 1부터 1001번지의 1까지의

자릿수는 총 9자리이므로

2의 8승 + 2의 0승 = 257입니다.)

 

iData에는 257이 대입됩니다.

 

 

따라서 2번 문제의 정답은 '257'입니다.

 

 

 


 

 

지금까지 포인터에 대해 다루었습니다.

그렇다면 이렇게 복잡한 포인터를

사용하는 이유는 무엇일까요?

 

일단 아래 코드를 살펴 봅시다.

 

이것이 실행된 후에 변수 a의 값은 몇일까요?

 

500이라고 생각하실 수 있지만 

그렇지 않습니다.

 

실행해 보니 a의 값이 그대로네요.

 

 

이렇게 되는 이유를 보겠습니다.

 

Test 함수가 호출되면서 

Stack 영역에는 main 함수와

Test 함수가 존재하게 됩니다.

 

Test 함수의 지역 변수 a에는 

처음에 100이 대입될 것입니다.

 

이후 Test 함수 내부의 코드로 인해

지역 변수 a에는 500이 대입되겠죠.

 

그리고 Test 함수가 종료되면서

Test 함수의 지역 변수 a가 소멸됩니다.

 

어떤가요? main 함수의 지역 변수 a는 

아무런 영향을 받지 않았죠?

 

 

그렇다면 Test 함수를 통해

main 함수의 지역 변수 a의 값을 

바꾸려면 어떻게 해야 할까요?

 

Test 함수의 지역 변수 a를 int형 포인터 변수로 바꾸고,

Test 함수를 통해 main 함수의 지역 변수 a의

주솟값을 넘겨주면 됩니다. 

 

물론 Test 함수의 내부 코드에

*를 붙여 해당 주소로 직접 접근하여

값을 대입할 수 있도록 해야겠죠.

 

이를 반영하여 코드를 수정하면

 

위와 같습니다. 

 

실행 결과 main 함수에 있는

변수 a에 500이 대입된 것을 확인할 수 있습니다.

 

 


 

 

 

scanf 구문 기억나시나요?

 

변수 a에, 입력한 값을 대입하려면

scanf를 사용해야 했습니다.

 

scanf를 사용할 때 값을 넣을

변수명 앞에 &가 붙는 이유를 

이제 아시겠죠?

 

scanf도 함수이므로 main 함수의

지역 변수인 a에 접근하여 값을 바꾸려면

주솟값을 받아 접근해야 하는 것이죠.

 

 

 

 

강의 출처 : https://www.youtube.com/watch?v=PFc4g8mxOiI&list=PL4SIC1d_ab-aOxWPucn31NHkQvNPHK1D1&pp=iAQB


 

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

C++ 기초 : const 포인터  (0) 2024.03.31
C++ 기초 : const  (0) 2024.03.30
C++ 기초 : 포인터 배열  (0) 2024.03.30
C++ 기초 : 포인터  (0) 2024.03.29
C++ 기초 : 운영체제  (0) 2024.03.29