함수 포인터

함수 포인터란 함수를 가리키는 포인터를 말한다.
(선언형식)
함수의 type  (*함수포인터명) (함수전달인자);

#include <stdio.h>
#include <stdlib.h>

int plus(int, int);
int minus(int,int);
int myCalc(int,int,int (*)(int,int)); // 선언
int main(int argc, char *argv[])
{
  int a=10, b=20;
  /*
  int hap;
  int (*fptr)(int,int); //함수포인터
 
  fptr = plus; //함수포인터(fptr)로 함수(plus) 가리키게 한다.
  hap = fptr(a,b);
 
  printf("%d + %d = %d\n", a,b,hap);
 
 
  int (*fptr2)(int,int);
  fptr2 = minus;
  printf("%d - %d = %d\n", a,b,fptr2(a,b));
  */
 
  myCalc(a,b,plus); //plus는 함수명
  myCalc(a,b,minus); //minus는 함수명
  system("PAUSE");   
  return 0;
}
int minus(int a,int b)
{
 return a-b;  
}

int plus(int a, int b)
{   
    return a+b;   
}
int myCalc(int a,int b,int (*fptr)(int,int) ) //fptr=함수포인터
{
 printf("%d  %d = %d\n", a,b,fptr(a,b)); //fptr=plus(), minus()
 return 0;  
   
}

void형 포인터

void포인터는 가리키는 대상체의 type에 제한이 없는 포인터를 말한다.
(선언형식)
void* 포인터명;

void *p;
int intArray[5] = {1,2,3,4,5};
double doubleArray[2][3] = {{1.5,2.5,3.5},{4.5,5.5,6.5}};
char *charPrtArray[4] = {"apple", "pear","banana","pineapple"};

p = intArray;
printf("%d\n", *((int*)p+2));

p=doubleArray;
printf("%lf\n", *(*((double(*)[3])p+1)+2) );

p=charPrtArray;
printf("%s\n", *((char**)p+2) );



포인터배열과 배열을 가리키는 포인터

int **p1; // p1은 1차원 int형 포인터를 가리키는 더블포인터
int *p2[5];  //p2는 요소가 5개인 배열로 각 배열의 요소는 int형 포인터다. ( 포인터 배열 )
int (*p3)[5]; //p3은 포인터로 열이 5개인 2차원 배열을 가리키는 포인터 변수로 배열의 각 요소는 모두 int형이다.



#include <stdio.h>
#include <stdlib.h>

    int num[3][4];
    int sum_h[3],sum_y[4];
int main(int argc, char *argv[])
{

    int max=0;
    int temp=0;   
    int input[10]={0,};
    int i,j;
    for(i=0; i<10; i++)
    scanf("%d", &input[i]);
    fflush(stdin);

    //선택정렬
    for(i=0; i<9; i++)
    {    //1 3 2 4 5 6 7 8 9 50
        max = i;
        for(j=i+1; j<10; j++)
        {
            if(input[max]<input[j])
            {
            max = j; //최대값이 있는 인덱스 저장
            }   
           

        }

        temp = input[i];
        input[i] = input[max];
        input[max] = temp;

    }

    for(i=0; i<10; i++)
        printf("%d ", input[i]);
 
  system("PAUSE");   
  return 0;
}

static 변수는 외부와 내부로 구분되어 진다.

static int b; //외부 정적변수
{
 static int a; //내부 정적변수
}

외부 정적변수와 내부 정적변수는 활동범위에 제약이 있다. 외부 정적변수는 자기가 속해 있는 모듈안에서만 사용할 때 사용한다. 모든 모듈에서 사용하고 싶을 땐 extern 키워드를 사용해야 한다. 내부 정적변수는 함수안에서 사용시 그 함수안에서만 사용이 가능하다. 즉 C++로 따졌을 때 class에서 private 변수로 사용하여 보호하는 것과 비슷한 맥락이다.

#include <stdio.h>
#include <stdlib.h>

void sub();

int main(int argc, char *argv[])
{
    int i;
    for(i = 0; i<3; i++)
    {
     sub();
     printf("main i : %d\n\n", i);         
    } 
  system("PAUSE");   
  return 0;
}

void sub()
{
     static int i=1;
     auto int k =3;
     printf("sub i : %d\t k : %d \t\n", i++,k++);
    
     }

다음은 틀리기 쉬운 기억클래스 예제이다. 결과값을 예측해볼것.

#include <stdio.h>
#include <stdlib.h>

void sub();

int reset(), next(int), last(int), now(int);
int i=1;


int main(int argc, char *argv[])
{
 auto int i,j;
 i = reset();
 
 for(j=0; j<3; j++)
 {
          printf("i = %d\t j = %d\n", i,j);
          printf("next(i) = %d\n", next(i));
          printf("last(i) = %d\n", last(i));
          printf("now(i+j) = %d\n\n", now(i+j));
          }
  system("PAUSE");   
  return 0;
}

int reset(){return(i);}
int next(int j){return (j=i++);}
int last(int j){
    static int i=10;
    return (j=i--);
    }
int now(int i)
{
    auto int j=10;
    return (i=j+=i);
   
    }
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

void gotoxy(int x, int y);
void blue();
void red();
void white();
void textcolor(int i);

int main(int argc, char *argv[])
{
      red();
      gotoxy(10,2); //10열 2행
      printf("hi\n");
     
      int i;
      for(i=0; i<=15; i++)
      {
       textcolor(i);
       printf("testing\n");       
      }


//      system("cls");   
  system("PAUSE");   
  return 0;
}


void gotoxy(int x, int y)
{
 COORD Pos={x - 1 , y - 1};
 SetConsoleCursorPosition(
                          GetStdHandle( STD_OUTPUT_HANDLE ), Pos
 );    
}

void blue()
{
 SetConsoleTextAttribute(
                          GetStdHandle( STD_OUTPUT_HANDLE ),
                          FOREGROUND_INTENSITY | FOREGROUND_BLUE
                          );
                        
     
}

void red()
{
 SetConsoleTextAttribute(
                          GetStdHandle( STD_OUTPUT_HANDLE ),
                          FOREGROUND_INTENSITY | FOREGROUND_RED
                          );
                        
     
}
void white()
{
 SetConsoleTextAttribute(
                          GetStdHandle( STD_OUTPUT_HANDLE ),
                          FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE 
                          );
                        
     
}
void textcolor(int i) //0:검정 ~ 15:흰색
{
 SetConsoleTextAttribute(
                         GetStdHandle(STD_OUTPUT_HANDLE), i
                         );
 
}

#include <stdio.h>
#include <stdlib.h>

int to_binary(int num);
int to_hex(int num);


int main(int argc, char *argv[])
{
    int num=0;
    printf("이진수화 할 십진수를 입력하시오 : ");
    scanf("%d", &num);
    //int num = 123;
       
   
    printf("십진수 %d 는 이진수로 : ", num);
    to_binary(num); // num=123;
    printf("\n");
   
    printf("16진수로 : 0x");
    to_hex(num);
    printf("\n");
   
   
 
  system("PAUSE");   
  return 0;
}


int to_binary(int num) //num = 123
{
   
    int remain = num%2; //1
   
   
    if(num >=2) // 123, 61, 30,
           {
            to_binary(num/2);    //61 , 30, 15, 7
               }
    printf("%2d", remain);        //마지막 호출부터 나옴
       
}

int to_hex(int num) //num = 123
{
   
    int remain = num%16;
   
   
    if(num >=16)
           {
            to_hex(num/16);    
    }
    /*
    switch(remain)
    {
     case 10:
          printf("a");
          break;
          case 11:
               printf("b");
               break;
               case 12:
                    printf("c");
                    break;
                    case 13:
                         printf("d");
                         break;
                         case 14:
                              printf("e");
                              break;
                              case 15:
                                   printf("f");
                                   break;
          default:
                  printf("%2d", remain);  
                  break;
                  }
     */
         printf("%2c", (remain < 10) ? remain +'0' : remain - 10 + 'a');
         //0은 48
        //printf("%d", '0');
}

+ Recent posts