[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