1. 아래 코드는 1부터 100까지의 수를 입력/출력 하는 기능을 예이다. 코드와 메모리 구조를 보고 문제에 답하시오.
코드
- 10개의 정수를 입력하는 메모리 10개를 정의하여 2차원 배열을 구현하였다.
- 메모리 접근 코드를 배열로 작성하였다.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int **arr = (int **)malloc(sizeof(int *) * 10);
if(arr == NULL) return 1;
for(int i = 0; i < 10; i++) {
arr[i] = (int *)malloc(sizeof(int) * 10);
if(arr[i] == NULL) return 1;
}
int num = 1;
for(int i = 0; i < 10; i++) {
for(int j = 0; j < 10; j++) {
arr[i][j] = num++;
}
}
for(int i = 0; i < 10; i++) {
for(int j = 0; j < 10; j++) {
printf("%3d ", arr[i][j]);
}
printf("\n");
}
for(int i = 0; i < 10; i++)
free(arr[i]);
free(arr);
return 0;
}
메모리 구조

1-1. arr[0][0]을 포인터 변수를 이용하여 출력하시오.
printf("%d\n", ________);
1-2. arr[1][0]을 포인터 변수를 이용하여 출력하시오. .
printf("%d\n", ________);
1-3 arr[2][4]를 포인터 변수를 이용하여 출력하시오.
printf("%d\n", ________);
1-4 arr[9][9]를 포인터 변수를 이용하여 출력하시오.
printf("%d\n", ________);
1-5. arr[0][0]의 값을 포인터 변수를 이용하여 999로 변경하시오.
________ = 999;
1-6 arr[1][2]의 값을 포인터 변수를 이용하여 777로 변경하시오.
________ = 777;
1-7. arr[3]이 가리키는 행의 시작 주소를 포인터 변수를 이용하여 출력하시오.
printf("%p\n", ________);
1-8 arr[2][5]의 주소를 포인터 변수를 이용하여 출력하시오.
printf("%p\n", ________);
1-9 다음 코드에서 arr + 4는 무엇을 가리키는가?
arr + 4
보기:
① arr[4][0]의 값
② arr[4]의 주소를 저장하는 공간
③ 5번째 행의 시작 주소
④ arr[0][4]의 주소
1-10 다음 배열 표현을 포인터 표현으로 바꾸시오.
arr[i][j]
________
풀이
더보기
1. *(*(arr + 0) + 0)
2. *(*(arr + 1) + 0)
3. *(*(arr + 2) + 4)
4. *(*(arr + 9) + 9)
5. *(*(arr + 0) + 0) = 999;
6. *(*(arr + 1) + 2) = 777;
7. *(arr + 3)
8. (*(arr + 2) + 5)
9. ② arr[4]의 주소를 저장하는 공간
단, *(arr + 4)는 5번째 행의 시작 주소
10. *(*(arr + i) + j)
정리하면, arr[i][j] == *(*(arr + i) + j)