/* 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;
}
'Study > C' 카테고리의 다른 글
구조체 공부 (0) | 2016.08.23 |
---|---|
c언어 복습 - 문자와 문자열 관련 함수 (0) | 2016.08.22 |
섭씨->화씨 변환, 최대 공약수 구하기 (0) | 2016.05.03 |
2016-04-07-업무일지_구조체 및 함수 (0) | 2016.04.07 |
2016-04-06-업무일지_포인터 및 함수 (0) | 2016.04.06 |