본문 바로가기
C/기초(두들낙서)

[C기초] 포인터와 배열 연습문제

by Meaning_ 2022. 1. 8.
728x90
반응형

1. 100개 이하의 정수를 입력받아 첫줄에 짝수번째 순서대로 출력하고 다음줄에 홀수 번째 숫자들을 순서대로 출력하는 프로그램을 작성하시오.

 

입출력예시

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
 
 
int main() {
    
    int arr[102];
    int num;
    scanf_s("%d"&num);
    for (int i = 1; i <= num; i++) {
        scanf_s("%d"&arr[i]);
    }
    //홀수 출력
 
    for (int i = 1; i <= num; i += 2) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    for (int i = 2; i <= num; i += 2) {
        printf("%d ", arr[i]);
    }
 
    
 
 
 
 
    
}
 
cs

 

2. ㄱ과 ㄴ에 해당하는 값을 쓰시오 

 

 

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include<string.h>
 
int main() {
    int arr[10= { 3,1,4,1,5,9,2,6,5,3 };
    printf("%d\n", arr);//ㄱ
    for (int i = 3; i < 7; i++) {
        printf("%d %d\n", arr + i, *(arr + i));//ㄴ
    }
    
}
cs

 

ㄱ은 arr[0]의 주소값

ㄴ은 arr[3]의 주소값,1(arr[3]의 값)

arr[4]의 주소값, 5

..중략..

arr[6]의 주소값,2

이런식으로 나온다

 

3. 10x10 이하의 정수형 이차원 배열을 입력 받아 그 배열의 각 행의 요소의 합을 출력하는 프로그램을 만들어보세요.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
int main() {
    int arr[12][12];
    int row, col;
    scanf_s("%d%d"&row, &col);
 
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            scanf_s("%d"&arr[i][j]);
        }
    }
 
    for (int i = 0; i < row; i++) {
        int sum = 0;
        for (int j = 0; j < col; j++) {
            sum += arr[i][j];
        }
        printf("%d\n", sum);
    }
}
cs

 

4.출력값들을 적으시오.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include<string.h>
 
int main() {
    int arr[3][3= { 0 };
    printf("%d\n"&arr);
    printf("%d\n", arr);
    printf("%d\n"*arr);
 
    printf("%d\n"&arr[0]);
    printf("%d\n", arr[0]);
    printf("%d\n"*arr[0]);
 
    printf("%d\n"&arr[0][0]);
    printf("%d\n", arr[0][0]);
}
 
cs

1.arr[0][0]의 주소값 --> 2차원 배열 전체를 가리키는 포인터, 맨첫번째 주소인 arr[0][0]의 주소가 출력

2.arr[0][0]의 주소값 --> arr은  &arr[0]와 같은데 이는 arr의 0번째 행을 하나의 배열로 본것이다. 이해하기 쉽게 arr[0]을 배열 ARR이라고 치환해보자. ARR은&ARR[0]이기에 &ARR[0]을 치환된걸 풀어줘서 arr의 식으로 돌려주면 &arr[0[0]이 된다. 

3.arr[0][0]의 주소값 -->arr은 &arr[0]이다. 그렇기에  arr이 가리키는 값은 arr[0]이고 arr[0]이  *arr[0]이라 볼 수 있다. 하지만 arr[0]은 일차원 배열이기에 arr[0]을 배열  ARR이라고 치환해보면 ARR은 &ARR[0]과 같고 이걸 풀어줘서 arr의 식으로 돌려주면 &arr[0][0]이 arr[0]이라 볼수 있다. 그렇기에 3번 답도 arr[0][0]의 주소값이 나오는 것이다.

4.arr[0][0]의 주소값

5.arr[0][0]의 주소값 --> arr[0]은 일차원 배열이기에 arr[0]을 배열 ARR로 치환해주면 ARR을 구하라는 문제이다. ARR은 ARR[0]의 주소값이기에 이걸 arr의 식으로 바꿔주면 arr[0][0]의 주소값이라 볼 수 있다. 

6. 0 --> arr[0]은 arr[0][0]의 주소값이다. 그렇기에 *arr[0]을 해주면 arr[0]이 가리키는 값이므로 arr[0][0]인 0이 출력된다.

7.arr[0][0]의 주소값

8.0

 

 

5. 주소값이 임의로 정해졌을 때 출력값을 적으시오.

 

arr[0][0]의 주소값이 100번지이다.&amp;nbsp;

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
 
int main() {
    int arr[3][3= { 0 };
    printf("%d\n"&arr[0][0]);
    printf("%d\n", arr[0+ 1);
    printf("%d\n"&arr[0+ 1);
 
    printf("%d\n", arr + 1);
    printf("%d\n"&arr + 1);
 
}
cs

 

1. 100

2. arr[0]은 일차원 배열이고, arr[0]은 &arr[0][0]을 의미하기에 여기서 4바이트를 더해주면 arr[0][1]의 주소값이므로 104번지이다.

3. &arr[0]은 arr과 같다. 그렇기에 arr+1을 하라는건 포인터가 arr[0]배열을 가리키고 있는데 여기서 1을 더해서 다음 배열인 arr[1]을 가리키고 있는 것이다. 그러면 arr[1]은 arr[1]의 주소값을 가리키고 arr[1]의 주소값은 대표값인 &arr[1][0]이다. 그렇기에 답은 112번지이다.

4. 3번과 똑같다. 112번지

5. &arr은 이차원 배열 arr 전체를 가리킨다. 여기에 1을 더해준다는건 다른 지역으로 넘어갔다는 것이다. 그렇기에 4*9를 더해주면 136번지가 답이다. 

만약에 &arr+2를 한다면 172번지가 될거다. 

 

 

6. 사진속 출력결과가 나오도록 코드 속 틀린부분을 찾고 고쳐쓰시오.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
 
int main() {
    int arr[3][4= {
        {1,2,3,4},
        {5,6,7,8},
        {9,10,11,12}
    };
    int(*ptr)[4= arr;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d "*ptr[i][j]);
        }
        printf("\n");
    }
 
}
cs

 

 

13번째 줄에 printf("%d "*ptr[i][j]); 이다.

int (*ptr)[4]=arr; 을 함으로써 포인터 자체를 2차원 배열로 쓸 수 있게 했는데

*ptr[i][j]는 이차원배열이 아니기 때문에 ptr[i][j]로 고쳐야한다. 

 

728x90
반응형

댓글