728x90


/*  Pointer Swap (double pointer 이용)  반드시 포인터에 저장된 값을 swap하도록! */

#include<stdio.h>


void SwapPtr(int* *dptr1, int* *dptr2)

{  

  int *temp = *dptr1;  // type이 일치해야 함

  *dptr1 = *dptr2;

  *dptr2 = temp;  

  //(*dptr1 = &num1 = ptr1 / *dptr2 = &num2 = ptr2) 

}


int main(void)

{

  int num1 = 10;

  int num2 = 20;


  int *ptr1;

  int *ptr2;


  ptr1 = &num1;

  ptr2 = &num2;

  printf("*ptr1, *ptr2 : %d  %d \n", *ptr1, *ptr2);


  SwapPtr(&ptr1, &ptr2);

  printf("*ptr1, *ptr2 : %d %d \n", *ptr1, *ptr2);

  return 0;

}



/*  Pointer Array Type 


// int ** dptr = &ptrArr[0]; / *(dptr[0]) = *(ptrArr[0]) = *(ptr1) = num1

// *ptr1=&num1;

*/

#include<stdio.h>


int main(void)

{

  int num1 = 10;

  int num2 = 20;

  int num3 = 30;


  int *ptr1 = &num1;

  int *ptr2 = &num2;

  int *ptr3 = &num3;

  

  int *ptrArr[] = { ptr1, ptr2, ptr3 }; 

  int ** dptr = ptrArr; // ptrArr이 double pointer,  ptrArr의 주소값에 대입하는 것

    

  printf("%d %d %d \n", *(ptrArr[0]), *(ptrArr[1]), *(ptrArr[2]));

  printf("%d %d %d \n", *(dptr[0]), *(dptr[1]), *(dptr[2]));


  return 0;

}



ptrArr은 int형 포인터를 요소로 갖는 배열의 이름이기 때문에 더블 포인터형


따라서 

 int **dptr = ptrArr;





/*  

  int * maxPtr;  int * minPtr;  int arr[5];

  함수 MaxAndMin, 위 배열과 두 포인터 변수에 대한 정보 전달

  maxPtr에 가장 큰값이 저장된 배열요소 주소 값, minPtr에 가장 작은 값이 저장된 배열요소 주소값 저장

*/


#include <stdio.h>


void MaxAndMin(int *arr, int size, int **MaxPtr, int **MinPtr);


int main()

{  

  int * maxPtr;

  int * minPtr;

  int arr[5];


  int i;

  for (i = 0; i < 5; i++)

  {

    printf("%d번째 정수 입력 : ", i + 1);

    scanf("%d", &arr[i]);

  }  


  MaxAndMin(arr, sizeof(arr) / sizeof(int), &maxPtr, &minPtr);

  printf("최대 : %d, 최소 : %d \n", *maxPtr, *minPtr);


  return 0;

}


void MaxAndMin(int *arr, int size, int **MaxPtr, int **MinPtr)

{

  int *max;

  int *min;  

  max = min = &arr[0];


  int i;

  for(i=0; i<size; i++)

  {

    if (*max < arr[i])

      max = &arr[i];


    if (*min > arr[i])

      min = &arr[i];    

  }


  *MaxPtr = max;

  *MinPtr = min;

}


/*  

  2d Array Address

*/


#include <stdio.h>


int main()

{

  int arr2d[3][3];

  printf("%p \n", arr2d);

  printf("%p \n", arr2d[0]);

  printf("%p \n \n", &arr2d[0][0]);


  printf("%p \n", arr2d[1]);  // +12  sizeof(int) x 3

  printf("%p \n", &arr2d[1][0]);  // +12


  printf("sizeof(arr2d): %d \n", sizeof(arr2d));  // 배열 이름의 size는 배열 전체의 크기

  printf("sizeof(arr2d[0]): %d \n", sizeof(arr2d[0]));  // 각 행의 size반환 (12)

  printf("sizeof(arr2d[1]): %d \n", sizeof(arr2d[1]));

  printf("sizeof(arr2d[2]): %d \n", sizeof(arr2d[2]));


  return 0;

}


2차원 배열이름의 포인터 형은 가리키는 대상과 가로 길이에 의존적이다. int [4][2]  [6][2]


int arr[3][4]의 포인터 형은

int (*ptr) [4];  //  [4]는 가로길이

포인터 연산시 4칸씩 건너뛰는 int형 변수 포인터


포인터 연산(+,-)을 했을 때의 주소값을 생각하면 된다.



/*  

  2차원 배열의 포인터 형

*/


#include <stdio.h>


int main()

{

  int arr1[2][2] = {

    {1,2},{3,4}

  };


  int arr2[4][2] = {

    {1,2,},{3,4},{5,6},{7,8}

  };


  int(*ptr)[2];

  int i;


  ptr = arr1;  // arr은 상수, ptr은 변수이므로 ptr이 arr1도 arr2도 가리킬 수 있다.

  printf("** Show 2,2 arr1 **\n");

  for (i = 0; i < 2; i++)

    printf("%d %d \n", ptr[i][0], ptr[i][1]);


  ptr = arr2;

  printf("** Show 2,2 arr1 **\n");

  for (i = 0; i < 4; i++)

    printf("%d %d \n", ptr[i][0], ptr[i][1]);


  return 0;

}


int* whoA [4];  // 포인터 배열 : 포인터 변수로 이루어진 배열

int (*whoB) [4];  // 배열 포인터 : 배열을 가리킬 수 있는 포인터 변수



함수포인터 


(매개변수)(반환형)


무엇을 전달받고 

무엇을 반환하는지 이해


/*  Function Pointer

num1,num2값을 더해서 보여주는 함수

string을 보여주는 함수를 메인함수에서 함수 포인터 변수로 호출

*/

#include<stdio.h>


void ShowAdd(int n1, int n2);

void ShowString(char * str);


int main(void)

{

  int num1 = 10, num2 = 20;

  char * str = "String";


  void(*Add_FuncPointer)(int, int) = ShowAdd;  // (int n1, int n2)

  void(*String_FuncPointer)(char *) = ShowString;


  Add_FuncPointer(num1,num2);

  String_FuncPointer(str);

  

  return 0;

}


void ShowAdd(int n1, int n2)

{

  printf("%d + %d = %d \n", n1, n2, n1 + n2);

}


void ShowString(char * str)

{

  printf("%s \n", str);

}



/*  Useful Function Pointer

*/

#include<stdio.h>


int WhoIsFirst(int age1, int age2, int(cmp)(int n1, int n2));

int OlderFirst(int age1, int age2);

int YoungerFirst(int age1, int age2);


int main(void)

{

  int age1 = 20;

  int age2 = 30;

  int first;


  printf("늙은 사람이 먼저 입장 \n");

  first = WhoIsFirst(age1, age2, OlderFirst);

  printf("%d세와 %d세중 %d세가 먼저 입장 \n\n", age1,age2,first);


  printf("젊은 사람이 먼저 입장 \n");

  first = WhoIsFirst(age1, age2, YoungerFirst);

  printf("%d세와 %d세중 %d세가 먼저 입장\n\n", age1,age2,first);


  return 0;

}


int WhoIsFirst(int age1, int age2, int(cmp)(int n1, int n2))

{

  return cmp(age1, age2);

}


int OlderFirst(int age1, int age2)

{

  if (age1 > age2)

    return age1;

  else if (age1 < age2)

    return age2;

  else

    return 0;

}


int YoungerFirst(int age1, int age2)

{

  if (age1 < age2)

    return age1;

  else if (age1 < age2)

    return age2;

  else

    return 0;

}



/*  

  18-1

*/


#include <stdio.h>


int main()

{

  int * arr1[5];

  int * arr2[3][5];


  int **ptr = arr1;

  int (*ptr2)[5] = arr2;  


  return 0;

}



arr[1][0][1]

== ( (*arr)+1) [0][1]

== (* (* (arr+1) +0 ) )[1]

== *( * ( * ( arr+1) + 0 ) +1 ) )

== ( * ( arr[1]+0 ) )[1]

==  *(*(arr[1]+0)+1) 

==  *(arr[1][0]+1)



/*  

   argument count, argument vector

*/


#include <stdio.h>


int main(int argument_count, char *argument_vector[])

{

  int i = 0;

  printf("전달된 문자열 수 : %d \n", argument_count);


  for (i = 0; i < argument_count; i++)

    printf("%d번째 문자열: %s \n", i + 1, argument_vector[i]);

      

  return 0;

}


/*

output:

전달된 문자열 수 : 4

1번째 문자열: E:\Visual Studio 2015\Projects\C_Study\Debug\C_Study.exe

2번째 문자열: I

3번째 문자열: Hate

4번째 문자열: You!

*/




/*  

   Argument Vector Parameter Type

*/


#include <stdio.h>


void Show_All_String(int argc, char *argv[]);


int main()

{

  char *str[3] = {

    "수박수박쑤",

    "씨발라먹을",

    "씨프로그래밍"

  };

  Show_All_String(4, str);

        

  return 0;

}


void Show_All_String(int argc, char *argv[])

{

  int i;

  for (i = 0; i < argc; i++)

    printf("%s \n", argv[i]);

}



/*

  end of argument vector (null)

*/


#include <stdio.h>


int main(int argument_count, char *argument_vector[])

{

  int i = 0;

  printf("전달된 문자열 수 : %d \n", argument_count);


  while (argument_vector[i] != NULL)

  {

    printf("%d번째 문자열: %s \n", i + 1, argument_vector[i]);

    i++;

  }

  return 0;

}



+ Recent posts