/*이차원 배열과 포인터를 완전히 이해하기 위해 정리하는 마지막 개념이자 문제들이다.*/
#첫번째 문제
/*
100개 이하의 정수를 입력받아
첫 줄에 짝수 번째 숫자들을 순서대로 출력하고,
다음 줄에 홀수 번째 숫자들을 순서대로 출력하는 프로그램
예
7
3 1 4 1 5 9 2
출력
1 1 9
3 4 5 2
if 6
1 1 9
3 4 5
*/
- 내가 짠 코드
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
30
31
32
33
34
35
36
|
#include<iostream>
int main(){
int arr[2][50];
int num, num2;
std::cin >> num;
for(int i = 0; i < num; i++){
std::cin >> num2;
if((i % 2) == 0){ //홀수번째 숫자
arr[1][i/2] = num2;
}
else{ //짝수번째 숫자
arr[0][i/2] = num2;
}
}
for(int i = 0; i < num/2; i++){
std::cout << arr[0][i] << " ";
}
std::cout << std::endl;
if(num % 2 != 0){
for(int i = 0; i < num/2+1; i++){
std::cout << arr[1][i] << " ";
}
}
else {
for(int i = 0; i < num/2; i++){
std::cout << arr[1][i] << " ";
}
}
std::cout << std::endl;
//std::cout << *arr[1] << std::endl;
}
|
cs |
2차원 배열을 활용해 각 행에 홀수와 짝수번째 숫자들을 각각 따로 각 행에 저장하여, 출력을 한 코드이다.
- 영상에서 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#include <iostream>
int main() {
int n;
int arr[105];
std::cin >> n;
for(int i = 0; i < n; i++){
std::cin >> arr[i];
}
for(int i = 1; i < n; i+=2){
std::cout << arr[i] << " ";
}
std::cout << std::endl;
for(int i = 0; i < n; i+=2){
std::cout << arr[i] << " ";
}
}
|
cs |
이 코드는 2차원 배열을 활용하지는 않고, 일차원 배열에 숫자들을 넣은 후, 출력할 때 한칸을 뛰어 넘은 후, 출력을 하게 한 코드이다.
#두번째 문제
/*
10*10 이하의 정수형 이차원 배열을 입력받아 그 배열이 각 행의 요소의 합을 출력하는 프로그램 만들기
예
3 4
4 2 6 3
7 9 3 4
5 1 2 1
출력 예
15
23
9
*/
- 내가 짠 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include<iostream>
int main(){
int row,col,n,sum=0;
std::cin >> row >> col;
int arr[row][col];
for(int i = 0; i < row; i++){
for(int j = 0; j < col; j++){
std::cin>>n;
arr[i][j] = n;
}
}
for(int i = 0; i < row; i++){
for(int j = 0; j < col; j++){
sum+=arr[i][j];
}
std::cout << sum << std::endl;
sum = 0;
}
}
|
cs |
이 코드는 이차원 배열을 정의한 후, 값을 입력 받고,
for문을 사용해 각 행의 요소들의 합을 출력한 코드이다.
*이차원 배열에서 행과 열이 헷갈릴 땐, 열 쇠로(세로)~~!!를 기억하자*
-영상에서 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include<iostream>
int main(){
int n,m;
int arr[12][12];
std::cin >> n >> m;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
std::cin >> arr[i][j];
}
}
for(int i = 0; i < n; i++){
int sum = 0;
for(int j = 0; j < m; j++){
sum += arr[i][j];
}
std::cout << sum << std::endl;
}
}
|
cs |
영상에서의 코드도 내가 짠 코드와 비슷하다.
#이차원 배열을 이해하기 더욱 쉽게 만들 개념
- 이차원 배열의 주소값
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include<iostream>
int main(){
using namespace std;
int arr[3][3] = {0};
cout << &arr << endl; //2차원 배열 전체를 가리키는 포인터
cout << arr << endl;
cout << *arr << endl;
cout << &arr[0] << endl;
cout << arr[0] << endl;
cout << *arr[0] << endl;
cout << &arr[0][0] << endl;
cout << arr[0][0] << endl;
//&arr == arr == *arr == &arr[0] == arr[0] == &arr[0][0]
// *arr[0] == arr[0][0]
}
|
cs |
&arr, arr, *arr, &arr[0], arr[0], &arr[0][0] 은 모두 arr[0][0]의 주소값을 가르키고,
*arr[0], arr[0][0]은 모두 arr[0][0]의 값을 가리킨다.
&arr은 배열 전체를 가리키는 때문에 출력은 배열의 첫 요소의 주소값을 출력한다.
배열의 첫 요소의 주소값은 arr[0][0]의 주소값이다.
arr은 &arr[0]과 같기에 첫행을 가리키고, 출력은 행의 첫 요소의 주소값을 출력한다.
행의 첫요소의 주소값은 arr[0][0]의 주소값이다.
*arr은 arr[0]과 같은 의미로 arr[0]의 첫 요소인 arr[0][0]의 주소값을 가르킨다.
arr[0]는 &arr[0][0]와 같고, arr[0][0]의 주소값을 출력한다.
&arr[0][0]은 arr[0][0]의 주소값을 불러오는 것이므로 arr[0][0]의 주소값을 출력한다.
*arr[0] *(&arr[0][0])과 같으므로, arr[0][0]의 값이 출력된다.
arr[0][0]은 arr[0][0]에 들어 있는 값이 출력된다.
- 이차원 배열의 주소값
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#include<iostream>
int main(){
using namespace std;
int arr[3][3] = {0};
//int 4바이트
cout << &arr[0][0] << endl; //100
cout << arr[0] + 1 << endl; //104
cout << &arr[0] + 1 << endl; //112
cout << arr + 1 << endl; //112
cout << &arr + 1 << endl; //136
}
|
cs |
arr[0][0]의 주소값은 100으로 가정한다.
&arr[0][0]은 이차원 배열의 첫 행의 첫 열의 요소의 주소값을 나타낸다.
따라서, 주소값에 1을 더한다면 int형이기에 4byte가 더해져 주소값은 104가 된다.
&arr[0]은 이차원 배열의 첫 행의 주소값을 나타낸다.
따라서, 주소값에 1을 더한다면 첫행이 3개의 int형 요소를 포함하기에 12byte가 더해져 주소값은 112가 된다.
arr은 &arr[0]과 같기 때문에 주소값에 1을 더하면 주소값은 112가 된다.
&arr은 이차원 배열 전체의 주소값을 나타낸다.
따라서, 주소값에 1을 더하면 이차원 배열이 행 3개, 열 3개 총 9개의 요소를 포함하고 있기에, 36byte가 더해져 주소값은 136이 된다.
- 이 코드는 오류가 난다. 틀린 이유는?
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
|
#include<iostream>
int main(){
using namespace std;
int arr[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
int (*ptr)[4] = arr; //이 포인터를 2차원 배열처럼 쓸 수 있음
for(int i = 0; i < 3; i++){
for(int j = 0; j < 4; j++){
cout << *ptr[i][j] << endl;
}
// *만 지우면 출력됨
cout << endl;
}
}
/*
원하는 출력
1 2 3 4
5 6 7 8
9 10 11 12
*/
|
cs |
int (*ptr)[4] = arr;
을 통해 ptr을 이차원 배열로 쓸 수 있다.
따라서 출력할 때, *ptr[i][j]에서 *를 지운 ptr[i][j]를 오류없이 출력할 수 있다.
출처(source) - 유튜브 두들낙서님
https://www.youtube.com/c/%EB%91%90%EB%93%A4%EB%82%99%EC%84%9C
c++ 최고의 강좌,,
'공부 > c++' 카테고리의 다른 글
#6 call-by-value | call-by-reference (0) | 2021.08.26 |
---|---|
#5 void함수에서 return을 사용하는 방법 (0) | 2021.08.26 |
#3 포인터 배열 | 포인터 배열과 배열 포인터의 차이 | 문자열과 포인터 배열 | c++ (0) | 2021.08.11 |
#2 배열과 포인터 | 포인터 간단 복습 | 포인터의 주소값 | 배열 포인터 | 2차원 배열과 배열 포인터 | c++ (0) | 2021.08.08 |
#1 이차원 배열 | 파스칼의 삼각형 | cin 다시 입력 받기 | 포인터 개념 | c++ | 기본 (0) | 2021.08.05 |