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. 주소값이 임의로 정해졌을 때 출력값을 적으시오.
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]로 고쳐야한다.
'C > 기초(두들낙서)' 카테고리의 다른 글
[C기초] 함수 재귀,배열을 매개변수로 넘기기 + 배열을 매개변수 넘기기 활용하여 문자열 공백없이 출력하기 (0) | 2022.01.10 |
---|---|
[C기초] 함수 반환/호출/프로토타입 (0) | 2022.01.09 |
[C기초] 포인터 배열 (0) | 2022.01.04 |
[C 백준] 브론즈 3/ 세 수 (0) | 2022.01.02 |
[C기초] 배열 포인터 (0) | 2022.01.02 |
댓글