본문 바로가기
프로그래밍

Void Pointer

by 건우아빠유리남편 2009. 7. 19.
반응형

#include <stdio.h>
#include <malloc.h>

//06.2.13 오늘 정리
// 1. 배열 포인터 모양. typedef 모양 외우세요.
// 2. 함수 포인터 모양. typedef 모양 외우세요.
// 3. 복잡한 표현식 -> 별로 쓸모는 없지만 그래도..!!!
// 4. 가변인자 함수 만들기 -> printf의 원리
// 5. void* 개념..예제..

// 숙제
// 1. 10page를 typedef를 사용해서 이해하기 쉽게 만들기
// 2. sort를 void포인터를 사용하여 모든 pointer를 받도록 수정 할것.
// 결국 C 표준 함수인 qsort()의 모양이 될겁니다.
// 자신 있는 분은 카페...없는 사람은 메일로 보내세요...


// 각종 문법을 어떻게 처리할지 컴파일러에게 지정 -> 표현식은 컴파일러마다 다르지만
//                                                  모든 컴파일러 마다 이런 개념이 있다.

// #pragma : 컴파일러나 링커에게 명령을 할때 사용한다. !
#pragma warning(error:4133) //4133은 에러로 취급해라.(option disable -> warning도 안뜬다.)
// 5 page : void * 이야기 - 오늘의 마지막 주제

// 1. void*의 의미 : 모든 주소를 담을수 있다...
// 2. void*는 크기가 필요한 연산은 할수 없다.!!!
// 3. 왜 void* 가 중요한가? - 모든 type을 처리할수 있게 된다.

// Linux 와 윈도우를 배울때 스레드 함수라는 것이 나옵니다.
// 이 함수에는 다양한 type의 인자를 넘길수 있습니다. - 용도에 따라 모든걸 넘길수 있습니다.

//Window 스레드 함수 인경우.
//long foo(void* p) // void* -> 아주 다양한 type이 전달 될수 있다는 의미.!!!!!!!**
//{
//}

// Code Reading - Code를 읽는 방법에 대해서.. 즉 관용구를 잘 설명해 준다.
// swap은 1개만 만들자 -> 모든 type이 다 동작하게 하자.
// 1. 인자는 void*로
// 2. void*는 사용전에 주로 다른 type으로 변경한다. - 주로 char*
// 3. void*가 함수인자일경우 그 크기가 넘어가야 하는 경우가 많다.
void swap(void *p1, void *p2, int s)
{
 int i;
 char *p3 = (char *)p1;
 char *p4 = (char *)p2;
 char t;

 for(i=0; i<s; ++i)
 {
  t = *(p3+i);
  *(p3+i) = *(p4+i);
  *(p4+i) = t;
 }
}

typedef struct _People
{
 char name[256];
 int age;
} People;

void main()
{
 People p1 = { "AAA", 20 };
 People p2 = { "BBB", 10 };

 swap( &p1, &p2, sizeof(p1)); //구조체도 OK...

 printf("%s \n", p1.name); //BBB
 printf("%d \n", p1.age);

 /*
 double a = 10;
 double b = 20;

 swap(&a, &b, sizeof(a));
 printf("a = %f\n", a);
 printf("b = %f\n", b);
 */
}

/*
void main()
{
 int n = 10;
 
 void* p  = &n;

 // p가 100번지라고 가정.
 //p = p + 1; //p는 얼마나 될까?? error 크기를 알수 없다.

 int k = *p; // k에 얼마나 들어갈까? - 크기가 필요하다. error


}
*/

/*
void main()
{
 int n = 10;
 //char* p = &n; //? char* = &int;
 //--------------------------------
 //void a; //error
 
 void* p = &n; // void* : 모든 종류의 주소를 담을수 있다.
               //         모든 주소는 void*로 암시적 형변환 된다.

 int* p2 = p; // int* <= void*  In C - OK...
                 //                IN C++ 에서 Error
              // 하지만 이경우 명시적으로 casting하는 것이 좋다.

 int* p3 = (int *)malloc(sizeof(100)); //malloc의 리턴값은 void* 이다.
 // int *p3 = void *;
 //

}
*/

반응형

'프로그래밍' 카테고리의 다른 글

WPF 및 Win32 상호 운용성 개요  (0) 2009.08.27
MS Access2007에서 DBCC 명령(인덱스 초기화) 하기...  (3) 2009.07.23
Valiable Arguments  (0) 2009.07.19
typedef에 관하여  (0) 2009.07.19
Quick Sort  (0) 2009.07.19

댓글