๐ก ์ ์ผ ์ดํดํ๊ธฐ ์ด๋ ค์ด ๊ฐ๋ ์ด์๋ค. ์์ง๊น์ง ํ๋ก๊ทธ๋จ์ ์ง๋ณด์ง ์์์ ํฌ์ธํฐ๋ฅผ ์ ์ฐ๋์ง(์คํ๋ ค ๋ณต์กํด..) ์ ๋ชจ๋ฅด๊ฒ ๋ค. ํ์ ์์ ์ ๋ง ์ฐ์ด๋์ง ๊ถ๊ธํ๊ธฐ๋ ํ์ง๋ง ์ผ๋จ ๋ฐฐ์ด ๊ฐ๋ ์ด๋ ์ ๋ฆฌํด ๋ณด๋๋ก ํ๊ฒ ๋ค.
ํฌ์ธํฐ๋?
C์ธ์ด์์ ํฌ์ธํฐ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๊ฐ์ ์ ์ฅํ๋ ๋ณ์์ด๋ฉฐ, ํฌ์ธํฐ ๋ณ์๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
int n = 100; // ๋ณ์์ ์ ์ธ
int *ptr = &n; // ํฌ์ธํฐ์ ์ ์ธ
http://www.tcpschool.com/c/c_pointer_intro
์ฐ์ฐ์
์ฃผ์ ์ฐ์ฐ์(&)
์ฃผ์ ์ฐ์ฐ์๋ ๋ณ์์ ์ด๋ฆ ์์ ์ฌ์ฉํ๋ฉฐ ํด๋น ๋ณ์์ ์ฃผ์๊ฐ์ ๋ฐํํ๋ค.
& ๊ธฐํธ๋ ์ฐํผ์๋(ampersand)๋ผ๊ณ ์ฝ์ผ๋ฉฐ ๋ฒ์ง ์ฐ์ฐ์๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
#include <stdio.h>
int main() {
int num1 = 3;
char num2 = 'A';
double num3 = 3.1415
int *ptr1 = &num1; // ์ ์ธ๊ณผ ๋์์ ์ด๊ธฐํ
char *ptt2 = &num2; // ์ ์ธ๊ณผ ๋์์ ์ด๊ธฐํ
double *ptr3 = &num3; // ์ ์ธ๊ณผ ๋์์ ์ด๊ธฐํ
printf("num1์ ์ ์ฅ์์น : %p\\n", ptr1); // num1์ ์ ์ฅ์์น : 001AF97C
printf("num2์ ์ ์ฅ์์น : %p\\n", ptr2); // num1์ ์ ์ฅ์์น : 001AF973
printf("num3์ ์ ์ฅ์์น : %p\\n", ptr3); // num1์ ์ ์ฅ์์น : 001AF960
printf("ํฌ์ธํฐ ๋ณ์ ptr1์ ํฌ๊ธฐ : %d\\n", sizeof(ptr1)); // ํฌ์ธํฐ ๋ณ์ ptr1์ ํฌ๊ธฐ : 4
printf("ํฌ์ธํฐ ๋ณ์ ptr2์ ํฌ๊ธฐ : %d\\n", sizeof(ptr2)); // ํฌ์ธํฐ ๋ณ์ ptr1์ ํฌ๊ธฐ : 4
printf("ํฌ์ธํฐ ๋ณ์ ptr3์ ํฌ๊ธฐ : %d\\n", sizeof(ptr3)); // ํฌ์ธํฐ ๋ณ์ ptr1์ ํฌ๊ธฐ : 4
return 0;
}
intํ, charํ, doubleํ์ ๊ฐ๊ฐ ์๋ฃํ์ด ๋ค๋ฅด๋ ์ฃผ์๊ฐ์ ํฌ๊ธฐ๋ ๋ฌด์กฐ๊ฑด 4Byte์ธ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ฉ๋ชจ๋ฆฌ์์์ ํฌ์ธํฐ์ ์ผ๋ฐ๋ณ์
https://m.blog.naver.com/skout123/50130648425
ํฌ์ธํฐ๊ฐ ์ผ๋ฐ๋ณ์์ ์ฃผ์๊ฐ์ ์ ์ฅํ ์ ์๋ ์ด์ ๋ ์ฒซ๋ฒ์งธ ๋ฐ์ดํธ์ ์ฃผ์ ๊ฐ๋ง์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฅผ ๋ค์ด doubleํ ๋ณ์์ธ num3์ ์ฃผ์๊ฐ์ ํฌ์ธํฐ๊ฐ ์ ์ฅํ ๋์๋ 8Byte์ ๋ชจ๋ ์ฃผ์ ๊ฐ์ ์ ์ฅํ๋ ๊ฒ์ด ์๋ ์ฒซ๋ฒ์งธ Byte์ ์ฃผ์ ๊ฐ๋ง ์ ์ฅํ๋ฏ๋ก ์๋ฌด ๋ฌธ์ ์์ด ์ผ๋ฐ๋ณ์์ ์ฃผ์ ๊ฐ์ ์ ์ฅํ ์ ์๋ค.
์ฐธ์กฐ ์ฐ์ฐ์(*)
์ฐธ์กฐ ์ฐ์ฐ์๋ ํฌ์ธํฐ์ ์ด๋ฆ์ด๋ ์ฃผ์ ์์ ์ฌ์ฉํ๋ฉฐ ํฌ์ธํฐ์ ๊ฐ๋ฆฌํค๋ ์ฃผ์์ ์ ์ฅ๋ ๊ฐ์ ๋ฐํํ๋ค.
#include <stdio.h>
int main() {
int num;
int *ptr; // * ์ฐ์ฐ์๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผ ๊ฐ๋ฅํ ๋ณ์๊ฐ ๋จ
ptr = # // ํฌ์ธํฐ๊ฐ ๋ณ์ num์ ์ฃผ์๊ฐ์ ์ ์ฅํจ
*ptr = 777; // ๋ณ์ num์๋ค๊ฐ 777์ ๋์
printf("ํฌ์ธํฐ ptr์ ์ ์ฅ๋ ๊ฐ : %d\\n", *ptr); // ํฌ์ธํฐ ptr์ ์ ์ฅ๋ ๊ฐ : 777
// ์์ printf์ *์ด ์ฐธ์กฐ ์ฐ์ฐ์์ด๋ค.
return 0;
}
๊ฐ์ ์ฐธ์กฐ ์ฐ์ฐ์(*)
int *ptr ์ *๊ฐ ๊ฐ์ ์ฐธ์กฐ ์ฐ์ฐ์์ด๋ค.
๋ค๋ฅธ ๋ง๋ก๋ ์ญ ์ฐธ์กฐ ์ฐ์ฐ์ ๋๋ *์ฐ์ฐ์๋ผ๊ณ ํ๋ค.
- ์ฐ์ฐ์์ ๊ธฐ๋ฅ์ ๋ฐ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํด์ ์ฃผ์ ๊ฐ์ ์ ์ฅ ํด๊ฐ๋ ๋ณ์๊ฐ ๋๋ค.
#include <stdio.h>
int main() {
int num;
int *ptr; // * ์ฐ์ฐ์๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผ ๊ฐ๋ฅํ ๋ณ์๊ฐ ๋จ
ptr = # // ํฌ์ธํฐ๊ฐ ๋ณ์ num์ ์ฃผ์๊ฐ์ ์ ์ฅํจ
*ptr = 777; // ๋ณ์ num์๋ค๊ฐ 777์ ๋์
printf("ํฌ์ธํฐ ptr์ด ์ ์ฅํ ์ฃผ์ ๊ฐ : %p\\n", *ptr); // ํฌ์ธํฐ ptr์ด ์ ์ฅํ ์ฃผ์ ๊ฐ : 00000309
printf("ํฌ์ธํฐ ptr์ ์ ์ฅ๋ ๊ฐ : %d\\n", *ptr); // ํฌ์ธํฐ ptr์ ์ ์ฅ๋ ๊ฐ : 777
printf("๋ณ์ num์ ์ ์ฅ๋ ๊ฐ : %d\\n", num); // ๋ณ์ num์ ์ ์ฅ๋ ๊ฐ : 777
return 0;
}
ํฌ์ธํฐ ํ์
ํฌ์ธํฐ๋ก ๊ฐ์ ๋์ ํด์ค ๊ฒฝ์ฐ ๊ทธ ๋์ ํ์ ์ ํฌ์ธํฐ ํ์ ์ผ๋ก ๊ฒฐ์ ํด์ค๋ค.
์๋ฅผ๋ค์ด ์๋์ ๊ฐ์ ์ฝ๋๊ฐ ์๋ค.
int val;
double *ptr = &val;
*ptr = 57
์์ ์ฝ๋์์ *ptr์ ํ์ ์ double์ด ๋๋ค.
๋ฐ๋ผ์ %d ์ ๊ฐ์ ์ ์ํ ์์๋ฌธ์์๋ ๋ฐ์ํ์ง ์๊ณ %f ๊ฐ์ ์ค์ํ ์์๋ฌธ์์๋ง ์ถ๋ ฅ๋๋ค.
๋จ์ํ ์ฃผ์ ๊ฐ๋ง ์ ์ฅํ๋ ๋ณ์๊ฐ ์๋ ๊ทธ ์ฃผใ ์ ๊ฐ์ ํ์ ์ ์ ๋ณด๋ ๊ฐ์ด ๋ด๊ณ ์๋ ๋ณ์์ด๋ค.
ํฌ์ธํฐ ์์ ์ฐ์ฐ
ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํด์ ์ฐ์ฐ๋ ํ ์ ์๋ค.
#include <stdio.h>
int main() {
int int1 = 100;
double double1 = 100.0001;
*(&int1) += 500;
*(&double1) += .0005;
printf("%d\\n", int1); // 600
printf("%f\\n", double1); // 100.0006
return 0;
}
voidํ ํฌ์ธํฐ
- voidํ ํฌ์ธํฐ๋ฅผ ์ ์ธํ๋ฉด ์ด๋ ํ ํ์ ์ ๋์์ฒด๋ผ๋ ๋ชจ๋ ๊ฐ๋ฆฌํฌ ์ ์๋ค.
int num = 40;
float num2 = 3.14;
double num3 = 999.99;
int num4;
double num5;
int *pi = &num4;
double *pd = &num5;
void *ptr;
ptr = &num1;
ptr = &num2;
ptr = &num3;
ptr = pi;
ptr = pd;
- ํ์ง๋ง ๊ฐ์ ์ฐธ์กฐ ์ฐ์ฐ์๋ฅผ ์ธ ์ ์์ผ๋ ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
int num1 = 777;
void *ptr = &num1;
printf("๋ณ์ num1์ ๊ฐ : %d\\n", *(int *)ptr); // ๋ณ์ num1์ ๊ฐ : 777
๋จผ์ ํ ๋ณํ ์ฐ์ฐ์ (int *) ๋ก voidํ ํฌ์ธํฐ ptr์ ํ์ ์ int๋ก ๋ณํ์์ผ์ฃผ์ด ๊ฐ์ ์ฐธ์กฐ ์ฐ์ฐ ํ ์ ์๊ฒ ํด์ค๋ค.
- voidํ ํฌ์ธํฐ์์๋ ์ฆ๊ฐ๋ ๊ฐ์๊ฐ์ ์ฐ์ฐ์ด ๋ถ๊ฐ๋ฅํ๋ค.
ํฌ์ธํฐ ์ฐ์ฐ
- ํฌ์ธํฐ๋ผ๋ฆฌ ๋ํ ์ ์๋ค.
#include <stdio.h>
int main() {
int a = 300;
int b = 700;
int *ptr1 = &a;
int *ptr2 = &b;
ptr1 + ptr2; // Error
return 0;
}
- ํฌ์ธํฐ๋ผ๋ฆฌ ๋บ ์ ์๋ค.
#include <stdio.h>
int main() {
char ar[] = "Pointer";
char *p1, *p2;
p1 = &ar[0];
p2 = &ar[5];
printf("%c์ %c์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ %d", *p1, *p2, p1-p2);
return 0;
}
ํฌ์ธํฐ๋ผ๋ฆฌ ๋นผ์ฃผ์ด ๋ฐฐ์ด์ 6๋ฒ์งธ ์์์ ์ฃผ์ ๊ฐ๊ณผ ๋ฐฐ์ด์ 1๋ฒ์งธ ์์์ ์ฃผ์ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด ๋ฉ๋ชจ๋ฆฌ์์์ ์ผ๋ง๋ ๋จ์ด์ ธ ์๋์ง ๊ตฌํด๋ผ ์ ์๋ค.
- ํฌ์ธํฐ์ ์ ์๋ฅผ ๋ํ๊ฑฐ๋ ๋บ ์ ์๋ค.
- ++๋ —๊ฐ์ ์ฐ์ฐ๋ ๊ฐ๋ฅํ๋ค.
- ์๋ฃํ์ ํฌ๊ธฐ๋งํผ ์ฆ๊ฐํ๊ณ ๊ฐ์ํ๋ค.
- ํฌ์ธํฐ๋ผ๋ฆฌ ๋์
์ ๊ฐ๋ฅํ๋ค.
- ๋์ ๋ฐ์ ํฌ์ธํฐ์ ๋์ ํด์ค ํฌ์ธํฐ์ ํ์ ์ด ์ผ์นํด์ผ ํ๋ค.
- ์ผ์นํ์ง ์๋๋ค๋ฉด ํ ๋ณํ ์ฐ์ฐ์๋ก ๊ฐ์ ํ ๋ณํ์ ํด์ฃผ์ด์ผ ํ๋ค.
- ๋ค๊ฐ ์ ์๋ ๋์ ํ ์ ์๋ค.
int num1 = 50, num2 =70;
int *ptr1 = &num1, *ptr2 = &num2;
int *ptr3;
ptr3 = ptr2 - ptr1; // Error
์์ ์์ ์์ ์ฃผ์ ๊ฐ - ์ฃผ์ ๊ฐ์ ํด์ฃผ์ด๋๋ฐ ๊ฒฐ๊ตญ ๋จ๋ ๊ฐ์ ์ฃผ์ ๊ฐ์ด ์๋ ์ ์์ด๋ค.
๋ฐ๋ผ์ ๋์ ํ ์ ์๋ค.
- ํฌ์ธํฐ์ ์ค์๋ ์ฐ์ฐ ํ ์ ์๋ค.
- ํฌ์ธํฐ๋ผ๋ฆฌ ๋น๊ต๋ ๊ฐ๋ฅํ๋ค.
- ๊ด๊ณ์ฐ์ฐ์(==, ≥, ≤, ≠, <, >)๋ฅผ ์ธ ์ ์๋ค.
- ์ด์ธ ์ฐ์ฐ์ ํ ์ ์๋ค.
- ๊ณฑ์ , ๋๋์ , ๋๋จธ์ง, ๋นํธ์ฐ์ฐ์๋ ์ธ ์ ์๋ค.
์ด์คํฌ์ธํฐ
int ** ptr;๋ก ์ฌ์ฉํ๋ค.
#include <stdio.h>
int main() {
int a = 3;
int *ptr1 = &a;
int *ptr2 = &ptr1;
int **dptr1 = &ptr1;
printf("ptr2์ ์ฃผ์ : %p\\n", ptr2); // ptr2์ ์ฃผ์ : 0022FF40
printf("dptr1์ ์ฃผ์ : %p\\n", dptr1); // dptr1์ ์ฃผ์ : 0022FF40
printf("dptr1์ด ๊ฐ๋ฆฌํค๋ ๊ฐ : %d\\n", **dptr1); // dptr1์ด ๊ฐ๋ฆฌํค๋ ๊ฐ : 3
return 0;
}
๋ง์น๋ฉฐ..
๋๋์ด ํฌ์ธํฐ ์ ๋ฆฌ๊ฐ ๋๋ฌ๋ค.
์๋๋ค ํฌ์ธํฐ ํจ์๋ ์์์ง….
ํฌ์ธํฐ ์ง์ฅ์์ ๊บผ๋ด์ค~~~
์ฐธ๊ณ ํ ์๋ฃ๋ค
[์ค์นด์ C์ธ์ด ๊ฐ์ข] 22-3 ์ด์ค ํฌ์ธํฐ
ํด๋น ๋ธ๋ก๊ทธ์ ํฌ์ธํฐ์ ๊ดํ์ฌ ์์ฃผ ์ธ์ธํ๊ฒ ์จ์ ธ์์ต๋๋ค. ์ด ํฌ์คํ ์ ๋๋ถ๋ถ์ ์์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ์ฌ ๊ธฐ๋กํ์์ต๋๋ค.
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Serverless์์ SQS ์ ํ ํ๊ณ ์ฌ์ฉํ๊ธฐ (0) | 2023.01.04 |
---|---|
๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด๋? (0) | 2023.01.04 |
๋ณ์์ ์ข ๋ฅ (0) | 2023.01.04 |
์ปดํจํฐ๊ฐ ์๋ฅผ ํํํ๋ ๋ฐฉ๋ฒ (0) | 2023.01.04 |
๋๋์ฒด TypeScript๊ฐ ๋ญ๊น? (0) | 2023.01.04 |