[C++] 배열 초기화(-1로 초기화), call by value, pointer, reference
2021. 4. 6. 02:49ㆍ개발 관련/c++
C++ 배열 초기화 방법
#include <stdio.h>
#include <memory.h> // memset
int main() {
int arr1[100]; // arr1은 초기화하지 않는다.
int arr2[100] = {0,}; // arr2를 전부 0으로 초기화
int arr3[100];
std::fill_n(arr3, 100, -1); // arr3을 배열의 크기 100까지 -1로 초기화
// 이차원배열도 마찬가지
int arr4[10][20];
std::fill(arr4[0], arr4[10], 100) // arr4의 0부터 10까지 100으로 초기화
for (int i = 0; i < 10; i++ )
printf("%d " , *arr4[i] ); // print하면 10개가 100으로 초기화되어있다.
int arr5[100];
for (int i = 0; i < 100; i++ ){ // arr5를 index값으로 초기화 ( for문 이용 )
arr5[i] = i;
}
int arr6[100] = { [0 ... 99] = -1 }; // arr6를 index 0부터 99까지 -1로 초기화
int arr7[100]; // arr7를 memset을 이용하여 0로 초기화
memset(arr7, 5, sizeof(arr7)); // 0으로 초기화할 때만 사용하도록 하자.
//(때로는 for문보다 빠름)
}
call by ~ (value, pointer, reference)
#include <stdio.h>
// call by value 방식
void v_plus(int num, int sum){
sum += num;
}
// call by value 방식 ( return을 통해서 값을 얻기)
int v_plus_ret(int num, int sum) {
return sum + num;
}
// call by pointer 방식 ( get, set )
void p_plus(int num, int *sum){
(*sum) += num;
}
//call by reference 방식 ( get, set )
void r_plus(int num, int &sum){
sum += num;
}
void main(){
int sum = 0;
int num = 1;
v_plus(num, sum); // sum : 0
sum = v_plus(num, sum); // sum : 1
sum = 0;
p_plus(num, &sum); // sum : 1; num은 변하지 않을 값
sum = 0;
r_plus(num, sum); // sum : 1;
}
3번째의 call by reference 방식은 c++에서 새로 추가된 방식이라고 한다.
C언어를 배울 때 call by reference 내용을 배웠었는데 그게 p_plus(..) 방식이었던 것 같다.
주소값이 가리키는 걸 찾아가는 연산의 수로 보면 p_plus(..)보다 r_plus(..)가 조금 적을 것 같다.
연산을 할 때 주소값을 계속 참조하는 것이 아니라 호출과 리턴할 때만 참조되기 때문이다.
주소값이 가리키는 값을 찾아가는 연산도 좀 적어보인다.
포인터연산은 참조의 참조( &&ref , **ptr ) 메모리 낭비와 시간 낭비가 크다고 배웠던 것 같다.
필요할 때만 쓰자.
배열의 call by ~ (value, pointer, reference)
#include <stdio.h>
// call by value 방식
void v_plus(int *num, int sum){
for (int i = 0; i < 3; i++ ){
sum += num[i];
}
// sum : 6
}
// call by value 방식 ( return을 통해서 값을 얻기)
int v_plus_ret(int num[], int sum) {
return sum + num;
}
// call by pointer 방식 ( get, set )
void p_plus(int num[], int *sum){
for (int i = 0; i < 3; i++ ){
(*sum) += num[i];
}
}
//call by reference 방식 ( get, set )
void r_plus(int num[], int &sum){
for (int i = 0; i < 3; i++ ){
sum += num[i];
}
}
// 배열은 포인터를 붙이지 않고 넘기면 호출된 함수에서 변화된 값이 저장된다.
void main(){
int sum = 0;
int num[] = {1, 2, 3};
v_plus(num, sum); // sum : 0
sum = v_plus(num, sum); // sum : 1
sum = 0;
p_plus(num, &sum); // sum : 1; num은 변하지 않을 값
sum = 0;
r_plus(num, sum); // sum : 1;
}
배열은 포인터를 붙이지 않고 넘기면 호출된 함수에서 변화된 값이 저장된다.( 주소값을 넘겼기 때문이다 )
참고 사이트
배열 초기화 : www.uwangg.com/36
std::fill() 사용법 : jacking75.github.io/cpp_stl_fill/
memset 사용법 : blockdmask.tistory.com/441
call by value, pointer, reference : jhnyang.tistory.com/319
'개발 관련 > c++' 카테고리의 다른 글
[C++] Vector 사용법 ( 삽입, 삭제, 검색, 공간 관리, call by reference ) (0) | 2021.04.06 |
---|