초보 코린이의 성장 일지

함수원형과 포인터 및 Const 사용 본문

C++

함수원형과 포인터 및 Const 사용

코오린이 2023. 1. 8. 17:25

C++와 ANSI C의 함수 원형 비교

- ANSI C는 C++로부터 함수 원형의 개념을 차용했다.

- 차이점 : ANSI C는 클래식 C언어와 호환성을 유지하기 위해 함수 원형의 사용이 선택적

                 C++은 함수 원형을 필수적으로 사용한다.

- C++에서는 void num(); 괄호 안을 비워 놓아도 그 안에 void라는 키워드가 들어 있다고 간주한다.

이 의미는 함수가 어떠한 매개변수도 요구하지 않는다는 것을 의미한다.

- ANSL C에서는 괄호 안을 비워 놓는 것은 매개변수가 무엇인지 밝히는 것을 거부한다는 뜻이다.

이 의미는 매개변수 리스트가 무엇인지 확인하지 않겠다는 의미이다.

 

ANSI C : ISO C,표준 C(Standard C)는미국 국립 표준 협회(ANSI)와국제 표준화 기구(ISO)가 출판한C 프로그래밍 언어의 이후 표준들을 가리킨다.


함수 원형이 사용자를 위해 하는 일

1. 컴파일러가 함수의 리턴값을 바르게 처리한다.

2. 사용자가 정확한 개수의 매개변수를 사용했는지 컴파일러가 검사한다.

3. 사용자가 정확한 데이터형의 매개변수를 사용했는지 컴파일러가 검사한다. 하지만 사용자가 정확한 데이  터를 사용하지 않았다면, 컴파일러가 정확한 데이터형으로 변환한다.


포인터와 배열을 처리하는 함수사용

 

int * arr == int arr[] 같은 의미로 대체가 가능, 이 둘은 arr이 int형을 지시하는 포인터라는 것을 의미한다.

const int * arr == const int arr[] 위와 동일하게 const를 붙여도 동일하다.

포인터가 배열의 첫 번째 원소를 지시할 때는 배열 표기, 하나의 독립된 값을 지시할떄는 포인터 표기사용

배열 이름을 포함하여 포인터에 1을 더하는 것은, 실제로 포인터가 지시하는 데이터형의 바이트 크기를 더하는 것이다.


포인터와 const

 

*pt 가 const int를 지시하고 있음으로, *pt를 사용하여 그 값을 변경할 수 없다. 간단하게 *pt가 const이므로 변경할 수 없다.

동일하게 지시하고 있으므로 사용이 불가능하며,  const로 선언되었기에 변경이 불가능하다.


위와 다른 두가지 가능성

1. const 변수의 주소를 const를 지시하는 포인터에 대입

2. const 변수의 주소를 일반 포인터에 대입

const로 지정한 변수의 주소값은 const 포인터 변수로 접근이 가능하다.

const로 지정한 변수의 주소값은 일반 포인터로는 접근이 불가능하다.

 

결론

- 데이터형 자체가 포인터가 아니라면 const 데이터의 주소든 const가 아닌 데이터의 주소든 const를 지시하는 포인터에 모두 대입할 수 있다.

- const가 아닌 데이터의 주소는 const가 아닌 포인터에만 대입할 수 있다.


값의 변경은 불가능하나 주소를 참조하여 지시는 가능

 

const로 선언되어있는 pt가 지시하는 age의 값은 변경이 불가능하다.

하지만 pt 자신의 값은 변경이 가능하다.

그러나 pt로 다른 변수인 &sage 주소를 가리킬 순 있지만 참조하여 값을 변경할 순 없다.

 

위 식을 참조하여 햇갈릴 수 있는 부분을 체크해 보겠다.

 

ps를 사용하여 sloth값을 변경할 수 없다. 하지만 ps가 다른 위치를 가리킬 순 있다.

finger이 sloth만을 지시하도록 제한한다.

그러나 finger를 이용하여 sloth의 값을 변결할 순 있다.

*ps 는 const가 되고, *finger와 ps는 const가 아니게된다.

 

위 식은 const 객체를 지시하는 const 포인터를 선언한 것이다.

 

stick는 trouble만을 가리킬 수 있고,  stick을 사용하여 trouble의 값을 변경할 수 없다.

stick와 *stick는 모두 const이다.

 


함수와 2차원 배열

 

sum() 함수는 왜 열의 수 (4)가 아닌 행의 수(3)를 매개변수로 전달하는 것일까?

data는 세 개의 원소를 가진 배열의 이름이다. 배열의 첫 번째 원소는 그 자체가 4개의 int값을 가진 배열이다.

그러므로 data의 데이터형은 4개의 int 값을 가진 배열을 지시하는 포인터가 된다.

 

괄호를 생략하고 표현하면 위와 같은 식이된다.

4개의 int값을 가진 배열을 지시하는 포인터를 선언하는것이 아닌, int값을 지시하는 포인터를 4개 가지고 있는 배열을 선언하는 것이 된다. 또 한 배열은 함수의 매개변수로 사용할 수 없다.

- 위 식에서 arr2는 배열이 아니라 포인터라고 선언한다. 포인터형인 arr2는 4개의 int값을 가지는 배열을 지시한다.

- 포인터형의 열의 수를 지정하고 있기 때문에, 열의 수를 별도의 매개변수로 함수에 전달하지 않아도 되는 것이다.

- 포인터형이 열의 수를 지정하고 있기 때문에, sum() 함수는 4개의 열을 가지고 있는 배열에 대해서만 동작한다.

- 그러나 행의 수는 변수 size로 지정하게되며, sum() 함수는 행의 수가 달라져도 동작한다.

 

위 식처럼 포인터가 함축되어 있다는 것도 명시하고 있어야한다.

 


매개변수와 참조 매개변수가 불일치

C++ 실제 매개변수 참조 매개변수가 일치하지 않을 때 임 변수를 생성할 수 있다. 매개변수가 const 참조 경우에만 이것을 허용한다. 이것은 새로운 제약이다. 이제 어떤 경우에만 생성이 가능한지 알아보자

 

참조 매개변수 const 일 경우

- 실제 매개변수가 올바른 데이터형이지만 lvalue가 아닐 때

- 실제 매개변수가 잘못된 데이터형이지만 올바른 데이터형으 변환할 수 있을때 

 

lvalue = 매개변수는 참조가 가능한 데이터 객체

 

rvalue, xvalue와 연관있으므로 나중에 다같이 다룰 예정  

'C++' 카테고리의 다른 글

ODR (One Definition Rule) - 유일 정의 규칙  (0) 2023.01.08
인라인(Inline) 함수  (0) 2023.01.08
Comments