- 함수 Function.cpp0.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 |