diff --git a/pointer/pointer_practice/1.ptr_var.c b/pointer/pointer_practice/1.ptr_var.c new file mode 100644 index 0000000000000000000000000000000000000000..52d45e10c4879e50466ecabdfaba2288a52f7590 --- /dev/null +++ b/pointer/pointer_practice/1.ptr_var.c @@ -0,0 +1,20 @@ +#include <stdio.h> + +int main(void) +{ + short n1=10, n2=20; + int n3=0x10203040; + short *p; //n1의 타입을 적는다. + p = &n1; + printf("n1:%d, *p:%d\n", n1, *p); + *p = 100; + printf("n1:%d, *p:%d\n", n1, *p); + (*p)++; + printf("n1:%d, *p:%d\n", n1, *p); + p = &n2; + printf("n2:%d, *p:%d\n", n2, *p); + p = &n3; + printf("n3:%x, *p:%x\n", n3, *p); + printf("n3:%x, *p:%x\n", n3, *(p+1)); + return 0; +} diff --git a/pointer/pointer_practice/2.constPtrVar.c b/pointer/pointer_practice/2.constPtrVar.c new file mode 100644 index 0000000000000000000000000000000000000000..ba41d10083fffebd201cc3b44b25e984f1f632c3 --- /dev/null +++ b/pointer/pointer_practice/2.constPtrVar.c @@ -0,0 +1,21 @@ +#include <stdio.h> + +int main(void) { + int n1=10, n2=20, n3=30; + int * p1=&n1; + const int * p2=&n1; //int를 상수화하겠다. + int * const p3=&n1; //p3를 상수화하겠다. p3의 주소값을 못바꾸게 하겠다. + const int * const p3=&n1; + + (*p1)++; + (*p2)++; //p2의 내용물을 변경할 수 없다. + (*p3)++; + (*p4)++; //p4 변경 x + + p1 = &n2; + p2 = &n2; + p3 = &n2; //p3를 변경할 수 없다. + p4 = &n2; //p4 변경 x + + return 0; +} diff --git a/pointer/pointer_practice/4.ptr_op1.c b/pointer/pointer_practice/4.ptr_op1.c new file mode 100644 index 0000000000000000000000000000000000000000..9f9f8ea0113558372e16ac72e61930818cec03ea --- /dev/null +++ b/pointer/pointer_practice/4.ptr_op1.c @@ -0,0 +1,19 @@ +#include <stdio.h> + +int main(void) +{ + short data[] = {1, 2, 3, 4, 5}; + short *p; + p = &data[0]; //p = data; + printf("data[0]:%d, *p:%d\n", data[0], *p); + p++; + printf("data[1]:%d, *p:%d\n", data[1], *p); + p += 2; + printf("data[3]:%d, *p:%d\n", data[3], *p); + p += -2; + printf("data[1]:%d, *p:%d\n", data[1], *p); + + //p *= 2; + //p /= 2; + return 0; +} diff --git a/pointer/pointer_practice/5.ptr_op2.c b/pointer/pointer_practice/5.ptr_op2.c new file mode 100644 index 0000000000000000000000000000000000000000..e5b875734c45c17fa1044ec137982b2a9bcc3489 --- /dev/null +++ b/pointer/pointer_practice/5.ptr_op2.c @@ -0,0 +1,16 @@ +#include <stdio.h> + +int main(void) +{ + short data[] = {1, 2, 3, 4, 5}; + short *p1=&data[0], *p2=&data[4]; + + printf("p1:%p, p2:%p\n", p1, p2); + printf("p1+4:%p\n", p1 + 4); + printf("p2-4:%p\n", p2 - 4); + printf("p2-p1:%d\n", p2 - p1); //주소 offset + //printf("p1+p2:%p\n", p1 + p2); + //printf("p1*p2:%p\n", p1 * p2); + //printf("p1/p2:%p\n", p1 / p2); + return 0; +} diff --git a/pointer/pointer_practice/6.ptrNarray1.c b/pointer/pointer_practice/6.ptrNarray1.c new file mode 100644 index 0000000000000000000000000000000000000000..4482e54dbdf12cceaf073425184d94256d7949bb --- /dev/null +++ b/pointer/pointer_practice/6.ptrNarray1.c @@ -0,0 +1,29 @@ +#include <stdio.h> + +int main(void) +{ + short arr[5] = {1, 2, 3, 4, 5}; + short *p; //p=arr; p=&arr[0]; short * const arr; + int i; + + p = &arr[0]; + printf("%d,%d\n", p[1], p[3]); + + p = &arr[1]; + printf("%d,%d\n", p[1], p[3]); + +#if 0 + for(i=0, p=arr; i<5; i++) { + printf("%d,%d\n", arr[i], p[i]); + printf("%d,%d\n", *(arr+i), *(p+i)); + } +#endif + for(i=0, p=arr; i<5; i++, p++) { + printf("%d,%d\n", arr[i], *p); + } + for(i=0, p=arr; i<5; i++, arr++) { + printf("%d,%d\n", p[i], *arr); + } + + return 0; +} diff --git a/pointer/pointer_practice/7.ptrNarray2.c b/pointer/pointer_practice/7.ptrNarray2.c new file mode 100644 index 0000000000000000000000000000000000000000..9a5f197becc64fa9f1d8bb3e7da60ba1fadd6f3b --- /dev/null +++ b/pointer/pointer_practice/7.ptrNarray2.c @@ -0,0 +1,41 @@ +#include <stdio.h> + +void printData_1(const short *data)//값 변경을 못하게 할 때 +{ + int i; + + for(i=0; i<5; i++) { + printf("%d,%d\n", data[i], *(data+i)); + //data[i] = 9999; //short * data일때 + } +} + +void printData_2(short data[5]) +{ + int i; + + for(i=0; i<5; i++) { + printf("%d,%d\n", data[i], *(data+i)); + } +} + +void updateData(short *data) +{ + int i; + for(i=0; i<5; i++) data[i] += 10; +} + +int main(void) +{ + short arr[5] = {1, 2, 3, 4, 5}; + + printf("-------------------------\n"); + printData_1(arr); + printf("-------------------------\n"); + printData_2(arr); + printf("-------------------------\n"); + updateData(arr); + printData_2(arr); + + return 0; +} diff --git a/pointer/pointer_practice/8.functionPtr1.c b/pointer/pointer_practice/8.functionPtr1.c new file mode 100644 index 0000000000000000000000000000000000000000..574013e1f0d235ed64d5d731159d8728fb66b4fe --- /dev/null +++ b/pointer/pointer_practice/8.functionPtr1.c @@ -0,0 +1,43 @@ +#include <stdio.h> + +int add(int d1, int d2) { + return d1+d2; +} +int sub(int d1, int d2) { + return d1-d2; +} +int mul(int d1, int d2) { + return d1*d2; +} +int div(int d1, int d2) { + if(d2) return d1/d2; + else { printf("Zero Dived Error!!\n"); return 0; } +} + +int main(void) +{ + int no, rst; + //함수 포인터 + int (*fp) (int, int); //add의 타입을 적어야 한다. //int(int, int) *fp; + //(*fp) : 포인터 변수이고 포인터 변수의 타입은 int(int,int) + + while(1) { + do { + printf("\nSelect(1.add, 2.sub, 3.mul, 4.div, 0.quit) => "); + scanf("%d", &no); + } while(no<0 || no>4); + if(no == 0) break; + + switch(no){ + case 1: fp = &add; break; + case 2: fp = sub; break; + case 3: fp = mul; break; + case 4: fp = ÷ break; + } + + rst = fp(10, 20); + printf("rst => %d\n", rst); + } + + return 0; +}