영넌 개발로그

[C++ 기초] 함수 파라미터, 아규먼트로 배열 입력(1차원, 다차원) /함수 포인터 Function Pointer 본문

코딩/C++

[C++ 기초] 함수 파라미터, 아규먼트로 배열 입력(1차원, 다차원) /함수 포인터 Function Pointer

영넌 2020. 10. 23. 18:12

int func_a(int k _) <--parameter

{ }

 

func_a(50); <--------- argument

 

배열 파라미터

1차원 배열의 합을 구하는 함수 2가지 >

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;

int sum_array_elements1(int _array[], int size) {
	int sum(0);

	for (int i = 0; i < size; i++) {
		sum += _array[i];
	}

	return sum;
}

int sum_array_elements2(int* _array, int size);


int main()
{
	
	int array_a[5] = { 1,2,3,4,5 };

	int sum = sum_array_elements1(array_a, 5);

	cout << "Array sum: " << sum << endl;
	return 0;
}

문제점: 함수 내에서 original array의 값을 바꿀 수도 있음

 

 

const 

pointer의 경거망동을 막아줌

데이터를 읽기만하고 쓰는건 불가능

 

int a =10; 일때,

아래 둘 간의 차이점은 무엇인가?

int * pa = &a;

const int * pb = &a;

 

pb[3] = 50; 불가능

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;

int sum_array_elements1(const int _array[], int size) {
	int sum(0);

	for (int i = 0; i < size; i++) {
		sum += _array[i];
	}

	return sum;
}

int sum_array_elements2(const int* _array, int size);


int main()
{
	
	int array_a[5] = { 1,2,3,4,5 };

	int sum = sum_array_elements1(array_a, 5);

	cout << "Array sum: " << sum << endl;
	return 0;
}

 

 

2차원 배열일 경우>

#include <iostream>

using namespace std;

int sum_2d_array(int _array[][3], int _row_cnt) {
	int sum(0);

	for (int r = 0; r < _row_cnt; r++)
	{
		for (int c = 0; c < 3; c++) {
			sum += _array[r][c];
			//sum += *(*(_array+r)+c);
		}
	}
	return sum;
}

/*
	int sum_2d_array2(int (*_array)[3], int _row_cnt);
	int * _array[3]은 틀린 문법 : 3개의 int*를 저장한다는 뜻이다. 
	괄호를 꼭 써주자!
*/

int main()
{
	int array_2d_a[2][3] = {
		{1,1,1},
		{2,2,2}
	};
	cout << "Sum: " << sum_2d_array(array_2d_a, 2) << endl;
	return 0;
}

 

 

Function Pointer

함수 주소를 담는 포인터

선언법 : return type (* 포인터이름) (parameter type) ;

           포인터이름 = 함수이름;

           포인터이름(파라미터);

 

실험용 코드>

#include <iostream>

using namespace std;

void func_A(void) {
	cout << "This is func_A" << endl;
}

void func_B(void) {
	cout << "This is func_B" << endl;
}

int func_C(int k) {
	cout << "This is func_C : " << k<<endl;
	return k + 1;
}

int main()
{
	void (*pf) (void);
	pf = func_A;
	pf();
	pf = func_B;
	pf();

	int(*pd) (int);
	pd = func_C;
	pd(5);
	cout << "After call: " << pd(5); 
	return 0;
}

 

 

 

Comments