[C] ํฌ์ธํ„ฐ๋ž€?

[์›๋ณธ ๋งํฌ]

C์–ธ์–ด ํ•™์Šต์ž๋“ค์„ ๊ฐ€๋กœ๋ง‰๊ณ  ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ์žฅ๋ฒฝ์€ ์•„๋งˆ ํฌ์ธํ„ฐ์ผ ๊ฒƒ์ด๋‹ค.

์‚ฌ์‹ค ๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต๋‹ค๊ณ  ๋А๊ปด๋ณธ ์ ์€ ์—†๋Š”๋ฐ... ๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ๋Ÿฐ๊ฑฐ๊ฒ ์ง€

์ •๋ง ์ดํ•ด๋งŒ ํ•˜๋ฉด ๋ณ„๊ฑฐ์•„๋‹Œ ๊ฐœ๋…์ด๋‹ค.


๋ณ€์ˆ˜๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ธฐ์–ตํ•˜๋Š”๊ฐ€?

๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์€ ํŠน์ • ๋ฉ”๋ชจ๋ฆฌ๊ณต๊ฐ„์— ์ด๋ฆ„์„ ๋ถ™์—ฌ์ค€๋‹ค๋Š” ๋œป์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํฌ์ธํ„ฐ๋Š” ๊ทธ ํŠน์ • ๋ฉ”๋ชจ๋ฆฌ๊ณต๊ฐ„์˜ ์ง„์งœ ์ด๋ฆ„์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์ด๋‹ค.

๋น„์œ ํ•˜์ž๋ฉด ๋ณ€์ˆ˜๋Š” ๋ณ„๋ช…์ด๊ณ , ํฌ์ธํ„ฐ๋Š” ๋ณธ๋ช…์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

๋ณ„๋ช…์€ ๋ถ€๋ฅด๊ธฐ์— ๋”ฐ๋ผ์„œ ์ˆ˜์‹ญ์ˆ˜๋ฐฑ๊ฐœ๋„ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณธ๋ช…์€ ํ•˜๋‚˜ ๋ฟ์ด๋‹ค.(๊ท€ํ™”๋ฅผ ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด)


๊ทธ๋ž˜์„œ ์ด๊ฑธ ๋„๋Œ€์ฒด ์–ด๋–ป๊ฒŒ ์“ด๋‹ค๋Š” ๊ฑด๊ฐ€?

์ด์   ๋ฐฉ๋ฒ•๋ก ์ ์ธ ์ธก๋ฉด์œผ๋กœ ๋ด๋ณด์ž.

์ผ๋‹จ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

int num=20;
int* ptr=#
printf("%d",*ptr);
//output->20

int* ๋Š” "int ํƒ€์ž…์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ ํƒ€์ž…" ์ด๋ผ๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
๋งˆ์ฐฌ๊ฐ€์ง€๋กœ char*, short*... ๋ญ๋“  *๋ฅผ ๊ฐ–๋‹ค๋ถ™์ด๋ฉด ๊ทธ ํƒ€์ž…์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ ํƒ€์ž…์ด ๋œ๋‹ค.

๊ทธ๋ž˜์„œ int* ํƒ€์ž…์˜ ๋ณ€์ˆ˜ ptr๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ptr๋„ ๋ณ€์ˆ˜๋‹ˆ๊นŒ ๊ฐ’์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค!

10์ด๋‚˜ 50๊ฐ™์€ ๊ทธ๋ƒฅ ์ˆซ์ž๋„ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ธด ์žˆ๋Š”๋ฐ, ๊ทธ๋ž˜๋ด์•ผ ์“ฐ์ง€๋„ ๋ชปํ•˜๋Š” ์“ฐ๋ ˆ๊ธฐ๊ฐ€ ๋  ๋ฟ์ด๋‹ค.

ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋‹ˆ๊นŒ ๋‹น์—ฐํžˆ ๊ทธ์— ๋งž๋Š” ํฌ์ธํ„ฐ ๊ฐ’(์ดํ•˜ ์ฃผ์†Œ๊ฐ’)์„ ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ๋“ฑ์žฅํ•˜๋Š” ๋ถ€๋ถ„์ด ๋ฐ”๋กœ &num์ด๋‹ค.
num ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๊ณ , ์ด๊ฒƒ์ด ptr์— ๋Œ€์ž…๋จ์œผ๋กœ์จ ptr์€ ์ง„์ •ํ•œ ํฌ์ธํ„ฐ์˜ ์—ญํ• ์„ ํ•  ์ˆ˜๊ฐ€ ์žˆ๊ฒŒ ๋œ๋‹ค...

์ด์ œ ptr์€ num์˜ ๋ณธ๋ช…(์ฃผ์†Œ๊ฐ’)์„ ๊ฐ–๊ณ  ์žˆ๋‹ค.
์ด ๋ณธ๋ช…์„ ๊ตณ์ด ์•Œ๊ณ ์‹ถ๋‹ค๋ฉด

printf("%p",ptr); ์ด๋ ‡๊ฒŒ ์“ฐ๋ฉด ๋œ๋‹ค. ์ˆซ์ž์™€ ์•ŒํŒŒ๋ฒณ์œผ๋กœ ์–ผ๋ฃฉ์ง„ 16์ง„์ˆ˜ ์ˆซ์ž๊ฐ€ ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค...

๊ทธ๋ฆฌ๊ณ  *ptr; ์ด๋ผ๋Š” ์—ฐ์‚ฐ์„ ํ–‰ํ•ด๋ณด์ž.
์—ฌ๊ธฐ์—์„œ์˜ ์€ ๊ณฑ์…ˆ๋„ ์•„๋‹ˆ๊ณ , int ํƒ€์ž…์—์„œ์˜ *๋„ ์•„๋‹Œ ๋ณ„๊ฐœ์˜ ์—ฐ์‚ฐ์ด๋‹ค. ๊ทธ๋ƒฅ ๊ธฐํ˜ธ๋งŒ ๊ฐ™๋‹ค.

์ € ๊ตฌ์ ˆ์„ ํ•ด์„ํ•˜์ž๋ฉด "ptr์— ๋‹ด๊ธด ๋ณธ๋ช…(์ฃผ์†Œ๊ฐ’)์„ ๋”ฐ๋ผ๊ฐ€์„œ ๊ฑฐ๊ธฐ์— ์ €์žฅ๋œ ๊ฐ’์— ์ ‘๊ทผํ•˜๊ฒ ๋‹ค"

๋ผ๋Š” ์˜๋ฏธ๊ฐ€ ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ 
*ptr=40;
์ด๋Ÿฐ์‹์œผ๋กœ ์ ‘๊ทผํ•ด์„œ ๋„ฃ์–ด์ฃผ๋ฉด

๋ณธ๋ช…์„ ํ†ตํ•ด์„œ ๋ณธ์งˆ์ ์ธ ์ ‘๊ทผ์„ ํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํžˆ num์˜ ๊ฐ’๋„ 40์ด ๋œ๋‹ค. (num์€ ๋ณ„๋ช…์ผ ๋ฟ์ด๋‹ค.)


๊ทธ๋ฆฌ๊ณ  ํŠน์ • ๊ตฌ๊ฐ„์˜ ๋กœ์ปฌ ๊ฐ’์„ ์™ธ๋ถ€์—์„œ ์ปจํŠธ๋กคํ• ์ˆ˜ ์žˆ๋„๋ก ๋„˜๊ฒจ์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.


int ํƒ€์ž… ๋ณ€์ˆ˜ num์„ ํ•จ์ˆ˜์— ๋„˜๊ฒจ์„œ ํ•˜๋‚˜ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ์ฝ”๋“œ๋ฅผ ์งœ๋ณด์ž.

void AddOne(int add)
{
ใ…คadd++;
}

int main()
{
ย ใ…คint num=10;
ใ…คAddOne(num);
ใ…คprintf("%d",num);
}

์ž ์ปดํŒŒ์ผ์„ ํ•ด๋ณด์ž.

๋ฌด์Šจ ๊ฐ’์ด ๋‚˜์˜ฌ๊นŒ?

์šฐ๋ฆฌ๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฐ’์€ 11์ธ๋ฐ

๊ฒฐ๊ณผ๋Š” 10์ด๋‹ค.

์™œ ๊ทธ๋Ÿด๊นŒ?

๋งค๊ฐœ๋ณ€์ˆ˜๋กœ์˜ ๊ฐ’ ์ „๋‹ฌ์€ ์˜ค๋กœ์ง€ '๊ฐ’' ์ „๋‹ฌ๋งŒ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

num์— ๋‹ด๊ธด ๊ฐ’์€ 10์ด๊ณ , AddOne ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ๋Š” 10์ด ์ „๋‹ฌ๋œ๋‹ค. num์ด ์•„๋‹ˆ๋ผ.

AddOne ์•ˆ์—์„œ ๊ทธ๋ƒฅ ์ƒ์ˆ˜ 10์„ ๊ฐ€์ ธ๋‹ค๊ฐ€ add ๋ณ€์ˆ˜์— ๊ฐ’์„ ๋Œ€์ž…ํ•ด๋„ฃ๋Š”๋ฐ,

๊ทธ๊ฑธ 0์œผ๋กœ ๋งŒ๋“ค๋“  35๋กœ ๋งŒ๋“ค๋“  num๊ณผ ๋„๋Œ€์ฒด ๋ฌด์Šจ ์ƒ๊ด€์ด๊ฒ ๋Š”๊ฐ€?

์ด๋Ÿด ๊ฒฝ์šฐ์— ํฌ์ธํ„ฐ๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.

ํฌ์ธํ„ฐ๋ฅผ ์ ์šฉํ•ด์„œ ๊ณ ์ณ๋ณด์ž.

void AddOne(int* add)
{
ใ…ค*add++;
}

int main()
{
ย ใ…คint num=10;
ใ…คAddOne(&num);
ใ…คprintf("%d",num);
}

๋๋‹ค. ์ด์   ์ •์ƒ์ ์œผ๋กœ 11์ด ์ถœ๋ ฅ๋œ๋‹ค.

AddOne์— num์˜ ์ฃผ์†Œ๋ฅผ ์ „๋‹ฌํ•˜๊ณ ,
AddOne ์•ˆ์—์„œ๋Š” ๊ทธ ์ฃผ์†Œ๋ฅผ ๋”ฐ๋ผ์„œ num์˜ ๋ณธ์ฒด์— ์ ‘๊ทผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


๊ทธ๋ฆฌ๊ณ  ๋˜ ํ•˜๋‚˜์˜ ์šฉ๋„๊ฐ€ ์žˆ๋‹ค.

int๋‚˜ double๊ฐ™์€ ๊ฑด ๋ญ 4๋ฐ”์ดํŠธ 8๋ฐ”์ดํŠธ๋ฐ–์— ์•ˆ๋˜๋‹ˆ๊นŒ ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์ „๋‹ฌํ• ๋•Œ ๊ทธ๋ƒฅ ๊ทธ๋Œ€๋กœ ์ „ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๊ตฌ์กฐ์ฒด๊ฐ™์€ ๊ฒฝ์šฐ๋ผ๋ฉด ์–ด๋–จ๊นŒ?
์ด๋Ÿฐ์ €๋Ÿฐ ์ •๋ณด๋“ค์ด ๋งŽ์ด ๋“ค์–ด๊ฐ€๋‹ค๋ณด๋ฉด ์ˆ˜์‹ญ๋ฐ”์ดํŠธ๋ฅผ ์ฐจ์ง€ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๋ณต์‚ฌ ์‹œ๊ฐ„๋„ ๋” ์žก์•„๋จน๊ฒŒ ๋œ๋‹ค.

ํฌ์ธํ„ฐ์˜ ํฌ๊ธฐ๋Š” ๋ณดํ†ต 4๋ฐ”์ดํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ์กฐ์ฒด ๋Œ€์‹  ๊ตฌ์กฐ์ฒด์˜ ํฌ์ธํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ํšจ์œจ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.


๊ทธ๋ฆฌ๊ณ  ํฌ์ธํ„ฐ ์ค‘์—์„œ๋„ ์ด์งˆ์ ์ธ ํฌ์ธํ„ฐ๊ฐ€ ์žˆ๋‹ค.

๋ฐ”๋กœ void* ํƒ€์ž…์ด๋‹ค.

์ด ํƒ€์ž…์€ ์–ด๋–ค ํฌ์ธํ„ฐ ํƒ€์ž…์ด๋“  ๋‹ค ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Œ€์‹  ์ฐธ์กฐ ์ ‘๊ทผ { ex)*ptr } ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทธ๋ž˜๋„ ๋ญ (int)ptr ์ด๋Ÿฐ์‹์œผ๋กœ ํŽธ๋ฒ•์„ ์“ฐ๋ฉด ๋˜๊ณ , ๋ณดํ†ต ํฌ์ธํ„ฐ ํƒ€์ž…์„ ํ™•์ •ํ•  ์ˆ˜ ์—†์„ ๋•Œ ์“ด๋‹ค.

์˜ˆ๋กœ, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋™์ ํ• ๋‹นํ•ด์ฃผ๋Š” alloc ๊ณ„์—ด ํ•จ์ˆ˜(malloc, calloc...)๋“ค์€ ๋ชจ๋‘ void๋กœ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ int ptr=(int*)malloc(sizeof(int)); ๊ฐ™์€ ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
alloc์— ๋„ฃ์„ ํƒ€์ž…์ด ๋ญ”์ค„์•Œ๊ณ  int*, char*๊ฐ™์€๊ฑธ ๋ฐ˜ํ™˜ํ•˜๊ฒ ๋Š”๊ฐ€...


ํฌ์ธํ„ฐ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์ด๊ฒŒ ๋‹ค๋‹ค.

๋ณ„๊ฑฐ ์—†๋‹ค.