C언어에서는 int는 정수형으로 2바이트를 의미한다고 토막강의에서 배웠는데요
여기서 계산할 때 int로 시작하는데 4바이트로 할당해서 계산이 들어가는데 도저히 이해가 안됩니다.
(참고로 컴활 파트4에 나오는 VBA만 이해한 상태이니 C언어 전혀 모르는 사람이라고 가정하시고 알려주시기 바랍니다.)
안녕하세요 길벗수험서 운영팀입니다.
int는 4바이트입니다. 2바이트는 32비트 컴퓨터 이전을 기준으로 강의한 것이며, 최근에 들어서는 int를 모두 4바이트로 취급하는 문제만 출제되니 이점 꼭 염두에 두시기 바랍니다.
사실 해당 문제는 자세하게 설명하느라 자료형 4byte니 뭐니 설명하고 있지만, 실상 간단하게 보자면 이점을 굳이 염두에 둘 필요는 없습니다.
포인터 변수라는 것은 메모리의 어느 지점을 가리키는 변수이고, 문제에서 int *p=a 라는 것은 a 배열의 시작 지점, 즉 a에 저장된 1을 가리키는 것이라고 이해하시면 됩니다.
그렇다면 a+3은 1에서 다음 3번에 해당하는 위치에 있는 값 3을 가리키라는 의미가 되죠.
(+1은 5, +2는 2, +3은 3, +4는 4)
이제 보기 항목들을 보죠.
처음 변수를 선언할 때 빼고 *은 포인터 변수가 가리키는 값을 의미하죠.
*(++p)의 '++'는 1을 더하라는 의미입니다. p에 1을 더한 후 가리키는 곳의 값을 의미합니다.
아까 p는 1을 가리켰으니 여기서 1을 더하면 다음 값인 5를 가리킬테니 출력되는 것은 5가 되겠죠.
*p는 아까 p가 1을 가리킨다고 했으니 1이 출력될 것입니다.
*(++a)는 1번 보기의 p와 같이 a에 1을 더한 후 가리키는 곳의 값을 의미합니다.
하지만 a는 배열의 이름으로 값이 고정되어 있어 '++'을 수행할 수 없으므로 *(++a)는 출력될 수 있는 값이 아닙니다.
p2는 3을 가리켰죠. 여기서 -2 지점의 값을 출력하라고 하였으니, 3에서 앞으로 2칸 이동한 값인 5가 출력되게 됩니다.
결국 이 문제는 배열의 이름 'a'가 ++이나 +1 등으로 값이 변경될 수 없다는 점만 알고 있다면 해결할 수 있는 문제가 되겠네요.
행복한 하루되세요 :)
-
관리자2023-08-10 11:18:49
안녕하세요 길벗수험서 운영팀입니다.
int는 4바이트입니다. 2바이트는 32비트 컴퓨터 이전을 기준으로 강의한 것이며, 최근에 들어서는 int를 모두 4바이트로 취급하는 문제만 출제되니 이점 꼭 염두에 두시기 바랍니다.
사실 해당 문제는 자세하게 설명하느라 자료형 4byte니 뭐니 설명하고 있지만, 실상 간단하게 보자면 이점을 굳이 염두에 둘 필요는 없습니다.
포인터 변수라는 것은 메모리의 어느 지점을 가리키는 변수이고, 문제에서 int *p=a 라는 것은 a 배열의 시작 지점, 즉 a에 저장된 1을 가리키는 것이라고 이해하시면 됩니다.
그렇다면 a+3은 1에서 다음 3번에 해당하는 위치에 있는 값 3을 가리키라는 의미가 되죠.
(+1은 5, +2는 2, +3은 3, +4는 4)
이제 보기 항목들을 보죠.
처음 변수를 선언할 때 빼고 *은 포인터 변수가 가리키는 값을 의미하죠.
*(++p)의 '++'는 1을 더하라는 의미입니다. p에 1을 더한 후 가리키는 곳의 값을 의미합니다.
아까 p는 1을 가리켰으니 여기서 1을 더하면 다음 값인 5를 가리킬테니 출력되는 것은 5가 되겠죠.
*p는 아까 p가 1을 가리킨다고 했으니 1이 출력될 것입니다.
*(++a)는 1번 보기의 p와 같이 a에 1을 더한 후 가리키는 곳의 값을 의미합니다.
하지만 a는 배열의 이름으로 값이 고정되어 있어 '++'을 수행할 수 없으므로 *(++a)는 출력될 수 있는 값이 아닙니다.
p2는 3을 가리켰죠. 여기서 -2 지점의 값을 출력하라고 하였으니, 3에서 앞으로 2칸 이동한 값인 5가 출력되게 됩니다.
결국 이 문제는 배열의 이름 'a'가 ++이나 +1 등으로 값이 변경될 수 없다는 점만 알고 있다면 해결할 수 있는 문제가 되겠네요.
행복한 하루되세요 :)