문제를 풀다 C와 C++의 1,2차원 배열 선언 초기화가 동적,정적에 따라서도 완전달라 포스팅을 해보려 한다.
C 1차원 배열 정적,동적 초기화
C 2차원 배열 정적,동적 초기화
C++ 1차원 배열 정적,동적 초기화
C++ 2차원 배열 정적,동적 초기화
순으로 진행된다.
먼저 C 1차원 배열 정적 초기화의 경우 일반적인 배열 초기화는 다들 알걸로 생각한다.
1
2
3
4
5
6
7
|
//int형의 5개 배열을 초기화
int arr[5]={5,9,3,4,2};
//개수를 생략해도 무방하다.
int arr[]={5,9,3,4,2};
|
cs |
1
|
int arr[5]={6,}
|
cs |
이렇게 하면 모두 6으로 초기화 된다는 포스팅이 많은데 그렇지 않다.
6 0 0 0 0이렇게 될뿐이다.
한번에 초기화하는 법은 찾아서 업데이트 하겠다...
배열원소를 외부에서 받아오는 동적 초기화 경우이다.
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
|
int num;
scanf("%d",&num);
///선언의 3가지 방식
//함수를 쓰지않고 바로 선언
int numarr[num];
//malloc함수를 사용해서 선언, #include <stdlib.h>필요
int *numarr;
numarr= (int *) malloc( sizeof(int*)*num );// 메모리 할당, 배열의 크기만큼 할당하기 위해 5를 곱한다.
free(numarr); // 항상 해제를 해주자
//calloc함수를 사용해 선언, #include <stdlib.h>필요
numarr= (int*) calloc(5, sizeof(int)); // sizeof(int)크기의 변수를 5개 저장할 수 있는 공간할당
free(numarr); // 항상 해제를 해주자
//여기서 malloc과 calloc의 차이점은 malloc은 할당된 공간에 쓰레기값이 들어가지만
calloc은 모두 0으로 초기화 시켜준다는 차이점이 있다.
|
cs |
이렇게 외부에서 숫자를 받아 1차원 배열 초기화를 할 수 있으며
1
2
3
4
5
|
for(int i=0;i<num;i++){
scanf("%d",&numarr[i]);
}
|
cs |
한꺼번에 calloc을 써서 동적 배열 원소를 모두 0으로 초기화 시킬 수 있다.
다른 숫자로 초기화는 아직 필자가 보지 못했다 아시는분 있으면 제보 부탁한다.
C 2차원 배열 정적 초기화
1
2
3
4
5
6
7
|
//int형의 3*5개 배열을 초기화
int arr[5][3]={{5,9,3}
{5,9,3}
{5,9,3}
{5,9,3}
{5,9,3}};
|
cs |
배열원소를 외부에서 받아오는 동적 초기화 경우이다.
1
2
3
4
5
6
7
8
9
10
11
|
//malloc함수를 사용해서 선언, #include <stdlib.h>필요
int **temp=NULL;
temp = (int **) malloc( sizeof(int)*num );
for( int i=0; i<num; i++) {
temp[i] = (int *) malloc( sizeof(int)*num );
}
//free는 반대순로 해주면 된다.
|
cs |
1
2
3
4
5
6
7
8
9
10
11
|
//calloc함수를 사용해 선언, #include <stdlib.h>필요
int **temp=NULL;
temp = (int**) calloc(num, sizeof(int)); // sizeof(int)크기의 변수를 5개 저장할 수 있는 공간할당
for( int i=0; i<num; i++) {
temp[i] = (int *) calloc(num, sizeof(int));
}
//free는 반대순로 해주면 된다
|
cs |
마찬가지로 외부에서 숫자를 받아 1차원 배열 초기화를 할 수 있으며
1
2
3
4
5
6
7
8
|
for(int i=0;i<num;i++){
for(int j=0;j<num;j++{
scanf("%d",&temp[i][j]);
}
}
|
cs |
한꺼번에 calloc을 써서 동적 배열 원소를 모두 0으로 초기화 시킬 수 있다.
다른숫자 초기화는 제보 부탁드립니다
C++ 1차원 배열 정적 초기화
1
|
int arr[5]={6,}
|
cs |
위와 같은 방법은 C++에서도 통하지 않는다. 첫번째만 6로 초기화되고 쓰레기값이 들어가거나 0으로 초기화되는 식이다.
1
2
3
4
5
6
7
8
9
10
11
|
#include<iostream>
using namespace std;
int main() {
int arr[5] = { 6, };
for (int i = 0; i < 5; i++) {
cout << arr[i] << endl;
}
return 0;
}
|
cs |
그럼 어떻게 초기화 하냐? 다행이 함수가 있다.
1
|
std::fill_n(arr, 5, 6);
|
cs |
위의 함수를 사용하면 arr의 5개 원소에 대해 6 6 6 6 6으로 초기화가 된다.
C++ 1차원 배열 동적 초기화
1
2
|
bool arr[MAXNUM];
std::fill_n(arr, MAXNUM, 1);
|
cs |
C++ 2차원 배열 정적 초기화
memset()함수를 이용해 초기화 할 수 있다.
1
2
3
4
5
|
//#include<string.h>를 포함해야 한다.
int arr[10][10];
for(int i=0; i<10; i++){
memset(arr[i], 0, sizeof(int)*10); //모든 값 0으로 초기화
}
|
cs |
여기서 주의 할 점 0,-1 대신 다른값은 초기화가 안된다. 예를 들어 6을 넣으면 6이 아닌 다른 숫자로 초기화된다.
바이트단위로 초기화 하기 때문이다.
C++ 2차원 배열 동적 초기화
정적초기화를 변형하여 적용하면 된다.
(참고) 모든 동적초기화는 C99표준 이상에서만 적용된다.
여기까지 포스팅하다 문득 든 생각은 배열 말고도 다른 STL EX. vector등 많은 우수한 템플릿이 있다는 것이다
굳이 배열을 써야하나를 느꼈다.ㅎ 참고만하자..
'Algorithm > 유용한 팁 (Tips)' 카테고리의 다른 글
vector, unordered_map 전체 순회 알고리즘 속도 비교 (2) | 2020.05.03 |
---|---|
[C++,구현] 백준 1764번 듣보잡 문제풀이, 배열,vector,map 속도비교 (0) | 2019.03.26 |
[C,C++] 지역변수와 전역변수 특징,백준 1463번 1로 만들기 풀이 (0) | 2019.03.11 |
[C++] 입출력 속도 가속시키기 백준 2741번 N찍기 풀이 std::ios_base::sync_with_stdio(0) (0) | 2018.08.06 |
댓글