정보처리기사 22년 2회차 (4월 24일) 79번 C언어 문제 해설
✏️ 문제
a[0]의 주소값이 10일 경우 다음 C언어 프로그램이 실행되 었을 때의 결과는? (단, int 형의 크기는 4Byte로 가정한다.)
#include <stdio.h>
int main(int argc, char *argv[]) {
int a[] = {14, 22, 30, 38} ;
printf("%u, ", &a[2]) ;
printf("%u", a) ;
return 0;
}
위의 C 프로그램이 실행될 때, 출력 결과는 a[2]의 주소 값과 a[0]의 주소 값이 출력됩니다. 주어진 조건에 따르면, a[0]의 주소 값은 10입니다. 또한, int 형의 크기는 4바이트입니다.
따라서, a[2]의 주소 값은 a[0] 주소 값에서 2번째 인덱스로 가는데 필요한 바이트만큼 이동한 곳에 있습니다. int형은 4바이트이므로 a[0]에서 a[2]로 이동하는데는 2*4=8 바이트가 필요합니다. 따라서, a[2]의 주소 값은 a[0]의 주소 값(10)에서 8을 더한 값인 18이 됩니다.
그러므로, 프로그램의 출력 결과는 "18, 10"이 됩니다.
"%u"는 C 언어에서의 형식 지정자입니다. 이 형식 지정자는 부호 없는 정수를 출력하는 데 사용됩니다. "%u"에 부호 없는 int를 주면, 해당 숫자는 부호 없는 10진수 정수로 출력됩니다.
그래서 위의 코드에서 printf 함수는 "%u"를 사용하여 a[2]의 주소와 배열 a의 시작 주소를 출력합니다. 주소는 일반적으로 부호가 없는 정수로 표현되므로, 이 경우 "%u"가 사용되었습니다.
✏️ 출력값
C 언어에서는 어떻게 변수나 배열을 참조하는지에 따라 출력되는 값이 달라집니다.
만약 변수 이름만 사용하면 그 변수의 값을 얻게 됩니다.a[2]
는 '30'이라는 값을 반환합니다.
그러나 변수 앞에 '&' 연산자를 사용하면 해당 변수의 메모리 주소를 얻게 됩니다.
예를 들어, &a[2]
는 배열 a의 세번째 원소의 메모리 주소를 반환합니다.
a
만 쓰게 되면 배열 이름 자체가 해당 배열의 첫 번째 원소의 주소를 가리키는 포인터로 작동하기 때문에, a는 a[0]의 주소를 나타냅니다.