레필리아
함수 포인터와 void 포인터
레필리아
레필리아의 잡동사니
레필리아
전체
오늘
어제
  • 전체보기 (151)
    • 개발 공간 (1)
      • 매크로 (1)
    • 컴퓨터공학 리서치 (23)
      • 공개 (23)
      • 비공개 (0)
    • 컴퓨터공학 기초 (70)
      • Computer architectur.. (0)
      • Embedded system (6)
      • Operating system (0)
      • Database (2)
      • C.C++ (32)
      • Network (0)
      • Java (12)
      • 문제 풀이 (18)
    • 창고 (57)
      • 미분류 (57)
      • 유틸리티 (0)
      • 쓰레기통 (0)
      • ESLAB (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • MSP430F5437

최근 댓글

최근 글

hELLO · Designed By 정상우.
컴퓨터공학 기초/C.C++

함수 포인터와 void 포인터

2011. 3. 14. 14:33

● 함수 포인터의 이해

 

 - 함수는 cpu에 의해 실행이 된다.
   > 결국은 메인 메모리 영역에 함수가 있어야 한다.

 

 - 함수이름도 실행시, 의미를 지닌다.
   > 메모리에 존재시, 함수이름은 메모리상의 위치를 가리키는 포인터다.
   > 결론 : 함수이름은 포인터다

 

 - main함수의 main도 의미를 지닌다.


ex)

int Fuction(int a, int b) {...}

int main(void) {Funtion(10, 20);...}

// Funtion란 이름의 포인터가 가리키는 메모리 공간에 존재하는 메함수를 호출 하라
// 10, 20 란 값을 메모리상에 올린다.

 

 

 

● 함수 타입

 

 - 함수 포인터 : 주소 + 자료형(타입)

 

 - 함수포인터 타입을 결정짓는 요소 : 리턴타입 + 매개 변수 타입
   > int fct(int a) ====> int (*fptr)(int);
     - (*fptr)는 리턴타입이 int 이고 인자값이 int형인 포인터이다
     - fptr : 변수, fct : 상수
     - fct(10) : fct 라는 포인터가 가리키는 메모리 공간에 가르키는 함수 호출
     - P(10); // 가능

   > double fct2(double a, double b) ====> double(*fPtr2)(double, double);
     - double (*p)(double, double) 함수를 가리키는 변수
     - 차이점 : fct2는 상수, p는 변수

 

 

예제 ) ================================================================================


#include <stdio.h>

 

void Add(int a, int b);  
void ChPrint(char* str);

 

int main(void)
{
 char * string = "This is a Function Pointer";
 
 int a = 10;
 int b = 20;

 void (*fPtr)(int, int) = Add;   
 void (*fPtr_1)(char* str) = ChPrint; 

 fPtr(a, b); // == Add(a, b);
 fPtr_1(string); // == ChPrint(str);

/*
 printf("%d, %d \n", Add, fPtr1); // 출력결과는 같다.
        // 결과적으로 가지는 값은 같다.
        // 함수포인터로 초기화 되었기 때문에, 같은 주소값이 출력

*/
 return 0;
}

 

void Add(int a, int b)
{
 printf("%d + %d = %d \n", a, b, a+b);
}

 

void ChPrint(char* str)
{
 printf("str = %s \n", str);
}

 

======================================================================================


● void형 포인터랑 무엇인가?
 
 - 주소값을 저장할수 있는 메모리 공간

 

 - 다만, 주소값을 저장할수 있는 제한이 없다.
   > ex) int* a;   // int형만 가리킨다.
         char* ch; // char 형만 가리킨다.
         void* v;   // 모든 타입을 가리킬수 있다.
 
 - 자료형에 대한 정보가 제외된, 주소 정보를 담을 수 있는 형태의 변수
 
 - 포인터 연산, 메모리 참조와 관련된 일에 활용 할수 없다.
 

int main(void)
{
 char c = 'b';
 int number = 10;
 void *p ;
 p = &c;
 p = &n;
}

int main(void)
{
 int n = 10;
 void * vp = &n; // OK!
 *vp = 20; // Error!... 몇바이트를 참조해야할까?(void형 포인터는 연산, 메모리 참조 불가)
              // 타입정보가 없음-> 메모리 참조X
(활용 : malloc 라는 동적 할당에서 다루겠음)
 vp++;     // Error!...

...
}


중요 예제 ) =============================================================================

 

// main_1.c

#include <stdio.h>

int main(int argc, char** argv)
{
 int i = 0;
 printf("전달된 문자열의 수 : %d \n", argc);

 for(i=0; i<argc; i++)
  printf("%d번째 문자열 : %s \n", i+1, argv[i]);

 return 0;
}

 

<그 림 이 해>

 

 

// c:\> main_1
// main함수 호출전에 입력한 main_1 문자열을 메모리공간에 올려 문자열 상수로 올린다.
// 이 문자열 주소값을 배열에 저장한다.
// 이 배열은 char형 포인터로 구성
// main함수의 매개변수를 위와 같이 한다면
// 생성된 문자열의 개수를 인자로 전달한다.


// 두번째 인자는 argv는 char* 의 주소값으로 전달
// argv -> 문자열의 주소값을 보관하고 있다.

// 입력시 프로그램의 실행파일이 (도스에서) 실행된다.

 

 

// c:\Exam에 실행파일이 있다고 가정
// c:\Exam> main_arg abcd 10234 // 문자열이 3개

// argc = 3

// arr[0] -> "main_arg"
// arr[1] -> "abcd"
// arr[2] -> "10234"

// 도스창내에서 문자열을 구분하는 것은 '공백'
// "abcd 1234" 이렇게 큰 따음표를 하면 하나의 문자로 인식


====================================================================================

'컴퓨터공학 기초 > C.C++' 카테고리의 다른 글

cout 출력 포맷 설정하기  (0) 2011.07.28
쓰레드(pthread_create, pthread_join)  (0) 2011.04.03
assert  (0) 2010.12.12
문자열 검색 함수 - strchr(), strrchr(), strstr(), strspn(), strcspn(), strpbrk()  (0) 2010.10.11
copy()와 특별한 이터레이터  (0) 2010.10.08
'컴퓨터공학 기초/C.C++' 카테고리의 다른 글
  • cout 출력 포맷 설정하기
  • 쓰레드(pthread_create, pthread_join)
  • assert
  • 문자열 검색 함수 - strchr(), strrchr(), strstr(), strspn(), strcspn(), strpbrk()
레필리아
레필리아
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.