본문 바로가기

c,c++

#4 함수, 포인터, 함수포인터, 구조체포인터 전반

#4code.zip
0.00MB

Function.cpp
0.00MB
- 함수

(자료형) (이름) (매개변수) { 몸체} 이런식으로 선언

서로 각각의 함수는 특정 권한을 주어지지 않는 이상 서로의 변수가 공유가 되지 않는다.

- 포인터 ​

포인터는 어떤 변수의 주소를 저장해서 다른 함수에서도 그 변수의 접근 권한을 허락하도록 하는 변수이다.

포인터 선언을 할 때 (자료형)* 변수 = &(참조하려는 변수명) ; 로 선언을 한다.

운영체제의 크기에 따라 pointer의 크기도 다르다 (32bit에서는 4바이트 ,64bit에서는 8바이트) 왜? => 32bit의 주소체계랑 64bit의 주소체계가 다르기 때문.

포인터는 특정한 데이터의 주소값을 보관하고(&연산자), *연산자를 이용하여 해당 주소값 내부에 있는 데이터를 접근할 수 있다

포인터는 변수 포인터 뿐만아니라 배열포인터 구조체포인터 함수포인터 도 존재한다.

포인터는 변수나 구조체 함수를 직접 콜하지않고, 주소만을 가지고 있기 때문에 메모리적으로 이득을 많이본다.

 

-배열 포인터

배열도 포인터선언으로 사용 가능하다. 단 포인터 선언을 할때 (자료형)* 변수 = (참조하려는 배열) 이렇게 선언한다

이유는 배열 arr이 주어졌다면, arr자체는 &arr[0]과 같기 때문이다.

배열 포인터는 결국 arr[0]의 시작점을 주소지로 갖는다.

포인터 parr = arr 이라면, parr + i 는 arr[i]의 주소지와 의미가 같다.

- 함수 포인터

함수도 포인터처럼 사용이 가능하다. 이럴시 다른 cpp파일에서 주소지를 꺼내와서 쓰는 방식이 가능하다.

1.일반적인 선언

void (*fp)();

fp = print_Hello;

2. 함수처럼 선언

int(*GetSub(int a, int b))(int, int)

{

printf("%d, %d\n", a, b); //여기서 GetSub에 들어가는 int a, int b는 참조하는 함수에는 영향을 미치지 않고 함수 내부에서만 사용이 된다.

return sub;

}

3. 구조체 처럼 선언

struct Cal //함수 포인터를 구조체로 사용하기

{

int(*fp)(int, int);

};

이 경우는 후에

Cal cal;

cal.fp = add; 이처럼 사용이 된다.

 

4. 함수포인터 자체를 함수의 매개변수로써 사용. ( 흔히들 많이 사용하는 방식)

void executer(int(*fp)(int, int))

{

printf("%d\n", fp(10, 20));

}

나중에 사용할 땐 executer(add); 이런식으로 사용하면 된다.

함수 포인터의 장점

1. 프로그램 코드가 간결해진다. (다른 cpp 파일에서 함수를 가져와서 쓸 수 있다)

2. 함수 포인터 배열에 담아서도 사용이 가능하므로, 중복되는 코드를 줄일 수 있다.

3. 상황에 따라 해당되는 함수를 호출 할 수 있어서 굉장히 유용하다.

- 구조체 포인터

구조체도 포인터처럼 사용이 가능하다. 일반적인 변수 포인터 선언과 같은 방식

그런데 구조체 내부의 파일을 접근 및 수정할 때 다음과같은 두가지 방식으로 수정이 가능하다.

직접참조 : (*ptr).hp = 0; (이경우에는 ptr의 주소지로 갖는 struct전체의 접근 권한을 가지고 직접 hp수치를 바꾼다는 느낌이고

간접참조 : ptr->hp = 0; (이 경우는 ptr의 hp만 주소지로 가져서 접근권한을 가진다는 뉘앙스로 생각하면 된다.

 

 

코드 모음

'c,c++' 카테고리의 다른 글

#1~ #5에 대한 예제 코딩.  (0) 2022.01.25
#5 얕은 복사 깊은 복사, 타입 캐스팅  (0) 2022.01.25
#3 배열, 구조체, 연산자  (0) 2022.01.19
#2 반복문과 난수생성  (0) 2022.01.19
#1. c 시작  (0) 2022.01.19