c언어 포인터 응용과 함수 포인터
TRANSCRIPT
C - 함수 포인터와 응용경성대학교 컴퓨터공학부 1학년
2014858110 정준혁
auto 와 static 변수• 메모리에는, Data영역, Heap영역, Stack영역
• auto 변수는 Stack 내에 자료를 저장.
• 선언은 auto int a 또는, int a 로 선언.
• static 변수는 Data 내에 자료를 저장.
• 선언은 static int a 로 선언.
• 프로그램 시작시 생성되고 종료시 삭제 됨.
Static과 auto변수 차이 예제
Static 변수 초기화
Auto 변수 초기화
각 변수의 메모리 주소 저장
변수의 존재 확인
static과 auto변수 차이 예제 - 실행결과
같은 메모리주소
• 같은 메모리 주소를 참조하여 값을 읽고 있지만, 결과는 다르다.
• Static 변수는 프로그램이 끝날 때 까지 메모리 상(Data 영역)에 존재하고, Auto 변수(기본 변수)는 스코프 내에서만 존재. (해당 스코프가 끝날 경우 변수는 사라짐)
Call By Address• 함수에서 인자를 포인터로 선언하여, 주소 값을 전달함으로 간접적으로 값을 이용하는 방식.
• ‘&’ 앰퍼샌드 연산자를 이용
• Call By Value는 실 변수의 값을 변환할 수 없음 (값을 대입하는 방식)
• Call By Address는 해당 변수를 서로 공유하는 것 -> 실 변수의 값을 직접 변환할 수 있음.
Age
*pAge 12FF7612
12
Call By Address 예제
main 함수 내의 값을 직접 변조
각 함수에 주소값을 인자로 전달한다
포인터 변수 예제 - 실행결과
• 메모리 주소를 전달하여, 메인 함수 내의 값을 직접 변환할 수 있다.
• 값을 서로 공유하는 것이기 때문에 불필요한 작업을 줄일 수 있다.
여기서 잠깐!
함수의 인자로 첫번째 사람의 주소와 명수, 그리고 금액을 받음
스택의 원리를 살짝 이용해서 반복된 코드를 간단하게 바꿔보자! (배열의 원리)
포인터 연산의 사용
실행결과
• 배열의 원리를 이용한 것. (연속된 자료형을 가진 변수는 연속된 메모리 주소를 가진다)
• 첫번째 변수의 주소 값과 변수의 개수를 넘겨주는 이유는 오버플로우를 방지하기 위한 것.
함수 포인터• 함수의 메모리 주소를 가진 포인터 변수
• 해당 포인터 변수에 매개변수를 대입함으로써, 간접적으로 함수를 사용할 수 있다.
• 예를 들어, addfunction 함수의 주소를 가진 afp 포인터 변수가 있다고 가정하자.-> *afp(10,10) 과 addfunction(10, 10)은 똑같이 작동한다.
return a + baddfunction
*afp 12FF74
함수 포인터 예제
함수 2개 초기화
간접 함수 호출
함수 포인터 초기화
초기화 된 함수 포인터에 함수 대입
실행결과
• 함수에도 주소가 있다.(함수 역시 기계어 코드가 메모리를 점유한 상태에서 작동 되는 것이기에)
• 간접 호출과 직접호출은 사실상 똑같이 작동한다.