์ด์ ์ฅ์์ ๋ณ์๋ ์๋ณ์(์ด๋ฆ)๋ก ์ก์ธ์คํ ์ ์๋ ์ปดํจํฐ ๋ฉ๋ชจ๋ฆฌ์ ์์น๋ก ์ค๋ช
๋์์ต๋๋ค. ์ด๋ฐ ์์ผ๋ก ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ฐ์ดํฐ์ ๋ฌผ๋ฆฌ์ ์ฃผ์์ ๋ํด ์ ๊ฒฝ ์ธ ํ์๊ฐ ์์ต๋๋ค. ๋ณ์๋ฅผ ์ฐธ์กฐํด์ผ ํ ๋๋ง๋ค ๋จ์ํ ์๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
C++ ํ๋ก๊ทธ๋จ์ ๊ฒฝ์ฐ ์ปดํจํฐ์ ๋ฉ๋ชจ๋ฆฌ๋ ํฌ๊ธฐ๊ฐ 1๋ฐ์ดํธ์ด๊ณ ๊ฐ๊ฐ โโ๊ณ ์ ํ ์ฃผ์๋ฅผ ๊ฐ์ง ์ผ๋ จ์ ๋ฉ๋ชจ๋ฆฌ ์
๊ณผ ๊ฐ์ต๋๋ค. ์ด๋ฌํ ๋จ์ผ ๋ฐ์ดํธ ๋ฉ๋ชจ๋ฆฌ ์
์ 1๋ฐ์ดํธ๋ณด๋ค ํฐ ๋ฐ์ดํฐ ํํ์ด ์ฐ์์ ์ธ ์ฃผ์๋ฅผ ๊ฐ๋ ๋ฉ๋ชจ๋ฆฌ ์
์ ์ ์ ํ ์ ์๋๋ก ํ๋ ๋ฐฉ์์ผ๋ก ์ ๋ ฌ๋ฉ๋๋ค.
์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๊ฐ ์
์ ๊ณ ์ ํ ์ฃผ์๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ์์ ์ฝ๊ฒ ์ฐพ์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฃผ์๊ฐ ์๋ ๋ฉ๋ชจ๋ฆฌ ์
์ 1776ํญ์ ์ฃผ์๊ฐ ์๋ ์
๋ฐ๋ก ๋ค์์ ์ต๋๋ค.1775๋ฐ ๊ฐ ์๋ ๊ฒ๋ณด๋ค ์์ 1777์ค๊ณ ๋ ๋ค์ ์ ํํ 1,000๊ฐ์ ์
์ด ์๊ณ ์ด์ ์๋ ์ ํํ 7761,000๊ฐ์ ์
์ด 2776์์ต๋๋ค.
๋ณ์๊ฐ ์ ์ธ๋๋ฉด ๊ทธ ๊ฐ์ ์ ์ฅํ๋ ๋ฐ ํ์ํ ๋ฉ๋ชจ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ์ ํน์ ์์น(๋ฉ๋ชจ๋ฆฌ ์ฃผ์)๊ฐ ํ ๋น๋ฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก C++ ํ๋ก๊ทธ๋จ์ ๋ณ์๊ฐ ์ ์ฅ๋๋ ์ ํํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ฅ๋์ ์ผ๋ก ๊ฒฐ์ ํ์ง ์์ต๋๋ค. ๋คํํ๋ ๊ทธ ์์
์ ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ํ๊ฒฝ์ ๋งก๊ฒจ์ง๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฐํ์ ์ ํน์ ๋ฉ๋ชจ๋ฆฌ ์์น๋ฅผ ๊ฒฐ์ ํ๋ ์ด์ ์ฒด์ ์
๋๋ค. ๊ทธ๋ฌ๋ ํ๋ก๊ทธ๋จ์ด ํน์ ์์น์ ์๋ ๋ฐ์ดํฐ ์
์ ์ก์ธ์คํ๊ธฐ ์ํด ๋ฐํ์ ์ค์ ๋ณ์์ ์ฃผ์๋ฅผ ์ป์ ์ ์๋ ๊ฒ์ด ์ ์ฉํ ์ ์์ต๋๋ค.
์ฃผ์ ์ฐ์ฐ์(&)
๋ณ์์ ์ฃผ์๋ ๋ณ์ ์ด๋ฆ ์์ ์ฐํผ์๋ ๊ธฐํธ( &)๋ฅผ ๋ถ์ฌ์ ์ป์ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ฃผ์ ์ฐ์ฐ์๋ผ๊ณ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด:
foo = &myvar;
์ด๊ฒ์ ๋ณ์์ ์ฃผ์ myvar๋ฅผ foo; ๋ณ์ ์ด๋ฆ ์์ ์ฃผ์ ์ฐ์ฐ์ ( )๋ฅผ ๋ถ์์ผ๋ก์จ ๋ ์ด์ ๋ณ์ ์์ฒด์ ๋ด์ฉ์ ์ ํ ๋นํ์ง ์๊ณ ์ฃผ์ myvar๋ฅผ ํ ๋นํฉ๋๋ค . ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ณ์์ ์ค์ ์ฃผ์๋ ๋ฐํ์ ์ ์ ์ ์ ์์ง๋ง ์ผ๋ถ ๊ฐ๋ ์ ๋ช ํํ ํ๊ธฐ ์ํด ๋ฐํ์ ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๋ฐฐ์น ๋๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค . ์ด ๊ฒฝ์ฐ ๋ค์ ์ฝ๋ ์กฐ๊ฐ์ ๊ณ ๋ คํ์ญ์์ค.&foo
myvar = 25;
foo = &myvar;
bar = myvar;
์ด๋ฅผ ์คํํ ํ ๊ฐ ๋ณ์์ ํฌํจ๋ ๊ฐ์ ๋ค์ ๋ค์ด์ด๊ทธ๋จ์ ๋์ ์์ต๋๋ค.
๋จผ์ ๊ฐ 25์ myvar(๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๊ฐ ๋ผ๊ณ ๊ฐ์ ํ ๋ณ์) ์ ํ ๋นํ์ต๋๋ค 1776. ๋ ๋ฒ์งธ ๋ช
๋ น๋ฌธ ์ ์ ์ฃผ์๋ฅผ
ํ ๋น ํฉ๋๋ค . ๋ง์ง๋ง์ผ๋ก ์ธ ๋ฒ์งธ ๋ช
๋ น๋ฌธ์ ์ ํฌํจ๋ ๊ฐ์ ์ ํ ๋น ํฉ๋๋ค . ์ด๊ฒ์ ์ด์ ์ฅ์์ ์ด๋ฏธ ์ฌ๋ฌ ๋ฒ ์ํ๋ ํ์ค ํ ๋น ์์
์
๋๋ค. ๋ ๋ฒ์งธ ๋ฌธ์ฅ๊ณผ ์ธ ๋ฒ์งธ ๋ฌธ์ฅ์ ์ฃผ์ ์ฐจ์ด์ ์ ์ฃผ์ ์ฐ์ฐ์ ( )์ ๋ชจ์์
๋๋ค. ๋ค๋ฅธ ๋ณ์์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ ๋ณ์
foo์ด์ ์์์)๋ C++์์ ํฌ์ธํฐ ๋ผ๊ณ ํ๋ ๊ฒ ์ ๋๋ค. ํฌ์ธํฐ๋ ์ ์์ค ํ๋ก๊ทธ๋๋ฐ์์ ๋ง์ด ์ฌ์ฉ๋๋ ์ธ์ด์ ๋งค์ฐ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ๋๋ค. ์ ์ ํ์ ํฌ์ธํฐ๋ฅผ ์ ์ธํ๊ณ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ญ์ฐธ์กฐ ์ฐ์ฐ์(*)
๋ฐฉ๊ธ ๋ณด์๋ฏ์ด ๋ค๋ฅธ ๋ณ์์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ ๋ณ์๋ฅผ ํฌ์ธํฐ ๋ผ๊ณ ํฉ๋๋ค . ํฌ์ธํฐ๋ ์ฃผ์๊ฐ ์ ์ฅ๋์ด ์๋ ๋ณ์๋ฅผ "๊ฐ๋ฆฌํค๋" ๊ฒ์
๋๋ค.
ํฌ์ธํฐ์ ํฅ๋ฏธ๋ก์ด ์์ฑ์ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ณ์์ ์ง์ ์ก์ธ์คํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ํฌ์ธํฐ ์ด๋ฆ ์์ ์ญ์ฐธ์กฐ ์ฐ์ฐ์ ( *)๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฉ๋๋ค. ์ฐ์ฐ์ ์์ฒด๋ "๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ"์ผ๋ก ์ฝ์ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ด์ ์์ ๊ฐ์ ๋ฐ๋ผ ๋ค์ ๋ช
๋ น๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
baz = *foo;
baz์ด๊ฒ์ " ์ด ๊ฐ๋ฆฌํค๋ ๊ฐ๊ณผ ๊ฐ์ "์ผ๋ก ์ฝ์ ์ ์์ผ๋ฉฐ foo๋ช
๋ น๋ฌธ์ ์ค์ ๋ก ๊ฐ 25์ baz์ ํ ๋นํฉ๋๋ค. ์๋ํ๋ฉด foois ์ด๊ณ (์์ ์ 1776์ ๋ฐ๋ผ) ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ์
๋๋ค. ๊ฐ ๊ฐ ์ ์ฐธ์กฐํ๋ ๋ฐ๋ฉด (์๋ณ์ ์์ ๋ณํ ๊ฐ ์์) ์ address ์ ์ ์ฅ๋ ๊ฐ์ ์ฐธ์กฐํ๋ ๊ฒ์ผ๋ก ์ด ๊ฒฝ์ฐ์๋ ์์ ๋ช
ํํ๊ฒ ๊ตฌ๋ณํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค . ์ญ์ฐธ์กฐ ์ฐ์ฐ์ ๋ฅผ ํฌํจํ๊ฑฐ๋ ํฌํจํ์ง ์๋ ๊ฒ์ ์ฐจ์ด์ ์ ์ฃผ๋ชฉํ์ธ์ (์ด ๋ ํํ์ ๊ฐ๊ฐ์ ์ฝ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ค๋ช
์ ์ถ๊ฐํ์ต๋๋ค).177625
foo1776*foo*177625
๋ฐ๋ผ์ ์ฐธ์กฐ ๋ฐ ์ญ์ฐธ์กฐ ์ฐ์ฐ์๋ ์ํธ ๋ณด์์ ์
๋๋ค.
- &๋ ์ฃผ์ ์ฐ์ฐ์ ์ด๋ฉฐ ๊ฐ๋จํ "~์ ์ฃผ์"๋ก ์ฝ์ ์ ์์ต๋๋ค.
- *์ญ ์ฐธ์กฐ ์ฐ์ฐ์ ์ด๋ฉฐ "๋ค์์ด ๊ฐ๋ฆฌํค๋ ๊ฐ"์ผ๋ก ์ฝ์ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ๊ทธ๊ฒ๋ค์ ์๋ก ๋ฐ๋๋๋ ์๋ฏธ๋ฅผ ๊ฐ์ต๋๋ค. ๋ก ์ป์ ์ฃผ์ &๋ ๋ก ์ญ์ฐธ์กฐ๋ ์ ์์ต๋๋ค *.
์ด์ ์ ๋ค์ ๋ ๊ฐ์ง ํ ๋น ์์
์ ์ํํ์ต๋๋ค.
myvar = 25;
foo = &myvar;
์ด ๋ ๋ฌธ์ฅ ๋ฐ๋ก ๋ค์ ๋ค์ ์์ ๋ชจ๋ true๋ฅผ ๊ฒฐ๊ณผ๋ก ๋ํ๋ ๋๋ค.
myvar == 25
&myvar == 1776
foo == 1776
*foo == 25
์ ์ํ๋ ํ ๋น ์์ ์ ๊ณ ๋ คํ๋ฉด ์ฒซ ๋ฒ์งธ ํํ์์ ๋งค์ฐ ๋ช ํ myvarํฉ๋๋ค myvar=25. ๋ ๋ฒ์งธ๋ ์ ์ฃผ์ &๋ฅผ ๋ฐํํ๋ ์ฃผ์ ์ฐ์ฐ์( )๋ฅผ ์ฌ์ฉ myvarํฉ๋๋ค 1776. ๋ ๋ฒ์งธ ํํ์์ด true์ด๊ณ ์ ๋ํด ์ํ๋ ํ ๋น ์์ ์ด ์๊ธฐ ๋๋ฌธ์ ์ธ ๋ฒ์งธ ํํ์์ ๋ค์ ๋ถ๋ช fooํฉ๋๋ค foo=&myvar. ๋ค ๋ฒ์งธ ํํ์์ "๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ"์ผ๋ก ์ฝ์ ์ ์๋ ์ญ์ฐธ์กฐ ์ฐ์ฐ์ ( )๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ ์ ์ค์ ๋ก ์ ๋๋ค. ๋ฐ๋ผ์ ๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์ ๊ฐ ๋ณ๊ฒฝ๋์ง ์๋ ํ ๋ค์ ํํ์๋ ๋ง์ฐฌ๊ฐ์ง์์ ์ถ๋ก ํ ์ ์์ต๋๋ค.
*foo == myvar
ํฌ์ธํฐ ์ ์ธ
ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ์ง์ ์ฐธ์กฐํ ์ ์๋ ๊ธฐ๋ฅ์ผ๋ก ์ธํด ํฌ์ธํฐ๋ ๋๋ a char๋ฅผ ๊ฐ๋ฆฌํฌ ๋์ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํฌ ๋ ๋ค๋ฅธ ์์ฑ์ ๊ฐ์ต๋๋ค . ์ญ์ฐธ์กฐ๋๋ฉด ์ ํ์ ์์์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์ํด ํฌ์ธํฐ ์ ์ธ์๋ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฐ์ดํฐ ์ ํ์ด ํฌํจ๋์ด์ผ ํฉ๋๋ค. ํฌ์ธํฐ ์ ์ธ์ ๋ค์ ๊ตฌ๋ฌธ์ ๋ฐ๋ฆ ๋๋ค. ์ฌ๊ธฐ์ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฐ์ดํฐ ์ ํ์ ๋๋ค. ์ด ์ ํ์ ํฌ์ธํฐ ์์ฒด์ ์ ํ์ด ์๋๋ผ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฐ์ดํฐ ์ ํ์ ๋๋ค. ์๋ฅผ ๋ค์ด:
int * number;
char * character;
double * decimals;
๋ค์์ ์ธ ๊ฐ์ง ํฌ์ธํฐ ์ ์ธ์
๋๋ค. ๊ฐ๊ฐ์ ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ ์ ํ์ ๊ฐ๋ฆฌํค๋๋ก ๋์ด ์์ง๋ง ์ค์ ๋ก๋ ๋ชจ๋ ํฌ์ธํฐ์ด๊ณ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์์ ๋์ผํ ์์ ๊ณต๊ฐ์ ์ฐจ์งํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค(ํฌ์ธํฐ์ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ ํ๋ซํผ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๊ณณ). ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๊ทธ๋ค์ด ๊ฐ๋ฆฌํค๋ ๋ฐ์ดํฐ๋ ๋์ผํ ์์ ๊ณต๊ฐ์ ์ฐจ์งํ์ง ์์ผ๋ฉฐ ๋์ผํ ์ ํ๋ ์๋๋๋ค. ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ๋ a , int๋ ๋ฒ์งธ ๋ฐ์ดํฐ๋ a char, ๋ง์ง๋ง ๋ฐ์ดํฐ๋ a ๋ฅผ ๊ฐ๋ฆฌํต๋๋ค double. ๋ฐ๋ผ์ ์ด ์ธ ๊ฐ์ง ์์ ๋ณ์๋ ๋ชจ๋ ํฌ์ธํฐ์ด์ง๋ง ์ค์ ๋ก๋ ๊ฐ๋ฆฌํค๋ ์ ํ ์ ๋ฐ๋ผ ๊ฐ๊ฐ , , ๋ฐ ๊ฐ๊ฐ int*๋ค๋ฅธ char*์ ํ ์ ๊ฐ์ต๋๋ค. ๋ณํ(double*
*) ํฌ์ธํฐ๋ฅผ ์ ์ธํ ๋ ์ฌ์ฉ๋๋ ํฌ์ธํฐ๋ ํฌ์ธํฐ(์ ํ ๋ณตํฉ ์ง์ ์์ ์ผ๋ถ์)์์ ์๋ฏธํ ๋ฟ์ด๋ฉฐ , ์กฐ๊ธ ์์ ๋ณธ ์ญ์ฐธ์กฐ ์ฐ์ฐ์ ์ ํผ๋ํด์๋ ์ ๋์ง๋ง ๋ณํ( *)๋ก ์์ฑ๋๊ธฐ๋ ํฉ๋๋ค. ๊ทธ๊ฒ๋ค์ ๋จ์ํ ๊ฐ์ ๊ธฐํธ๋ก ํํ๋๋ ๋ ๊ฐ์ง ๋ค๋ฅธ ๊ฒ์
๋๋ค.
ํฌ์ธํฐ์ ๋ํ ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
// my first pointer
#include <iostream>
using namespace std;
int main ()
{
int firstvalue, secondvalue;
int * mypointer;
mypointer = &firstvalue;
*mypointer = 10;
mypointer = &secondvalue;
*mypointer = 20;
cout << "firstvalue is " << firstvalue << '\n';
cout << "secondvalue is " << secondvalue << '\n';
return 0;
}
์ฒซ ๋ฒ์งธ ๊ฐ์ 10์
๋๋ค.
๋ ๋ฒ์งธ ๊ฐ์ 20์
๋๋ค.
๋ ๋ค ํ๋ก๊ทธ๋จ์์ ์ง์ ์ ์ผ๋ก ๊ฐ์ ์ค์ ํ์ง ์๋๋ผ๋ ๋ ๋ค ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ ์ผ๋ก ๊ฐ์ ์ค์ firstvalueํ๊ฒ ๋ฉ๋๋ค . ์ด๊ฒ์ด ๋ฐ์ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๋จผ์ ์ฃผ์ ์ฐ์ฐ์( )๋ฅผ ์ฌ์ฉํ์ฌ ์ฒซ ๋ฒ์งธ ๊ฐ์ ์ฃผ์๊ฐ ํ ๋น๋ฉ๋๋ค . ๊ทธ๋ฐ ๋ค์ ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ์ ๊ฐ์ด ํ ๋น๋ฉ๋๋ค . ์ด ์๊ฐ ๊ฐ ์ ๋ฉ๋ชจ๋ฆฌ ์์น๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ์ ๊ฐ์ด ์์ ๋ฉ๋๋ค. ํฌ์ธํฐ๊ฐ ํ๋ก๊ทธ๋จ์์ ์๋ช ๋์ ๋ค๋ฅธ ๋ณ์๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์์์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ด ์์ ์์๋ ๋์ผํ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก์ธ์ค๋ฅผ ๋ฐ๋ณตํฉ๋๋ค . ๋ค์์ ์กฐ๊ธ ๋ ์ ๊ตํ ์์ ๋๋ค.
// more pointers
#include <iostream>
using namespace std;
int main ()
{
int firstvalue = 5, secondvalue = 15;
int * p1, * p2;
p1 = &firstvalue; // p1 = address of firstvalue
p2 = &secondvalue; // p2 = address of secondvalue
*p1 = 10; // value pointed to by p1 = 10
*p2 = *p1; // value pointed to by p2 = value pointed to by p1
p1 = p2; // p1 = p2 (value of pointer is copied)
*p1 = 20; // value pointed to by p1 = 20
cout << "firstvalue is " << firstvalue << '\n';
cout << "secondvalue is " << secondvalue << '\n';
return 0;
}
์ฒซ ๋ฒ์งธ ๊ฐ์ 10์
๋๋ค.
๋ ๋ฒ์งธ ๊ฐ์ 20์
๋๋ค.
๊ฐ ํ ๋น ์์
์๋ ๊ฐ ํ์ ์ฝ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ค๋ช
์ด ํฌํจ๋ฉ๋๋ค. ์ฆ, ์ฐํผ์๋( &)๋ฅผ "์ฃผ์"๋ก, ๋ณํ( *)๋ฅผ "๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ"์ผ๋ก ๋์ฒดํฉ๋๋ค. ์ญ์ฐธ์กฐ ์ฐ์ฐ์ ( ) ๊ฐ ์๋ ๊ฒ๊ณผ ์๋ ๋ชจ๋ ํฌ์ธํฐ ๋ฐ
๊ฐ ์๋ ํํ์์ด ์์ต๋๋ค . ์ญ์ฐธ์กฐ ์ฐ์ฐ์ (*) ๋ฅผ ์ฌ์ฉํ๋ ํํ์์ ์๋ฏธ๋ ๊ทธ๋ ์ง ์์ ํํ์๊ณผ ๋งค์ฐ ๋ค๋ฆ
๋๋ค. ์ด ์ฐ์ฐ์๊ฐ ํฌ์ธํฐ ์ด๋ฆ ์์ ์ฌ ๋ ํํ์์ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ์ฐธ์กฐํ๋ ๋ฐ๋ฉด ์ด ์ฐ์ฐ์ ์์ด ํฌ์ธํฐ ์ด๋ฆ์ด ๋ํ๋๋ฉด ํฌ์ธํฐ ์์ฒด์ ๊ฐ(์ฆ, ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์)์ ๋ํ๋
๋๋ค. ์ฃผ์๋ฅผ ํ๊ธฐ์ํฌ ์ ์๋ ๋ ๋ค๋ฅธ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.p1p2*
int * p1, * p2;
์ด๊ฒ์ ์ด์ ์์ ์์ ์ฌ์ฉ๋ ๋ ํฌ์ธํฐ๋ฅผ ์ ์ธํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ ํฌ์ธํฐ ๋ชจ๋ ์ ํ (ํฌ์ธํฐ ) *์ ๊ฐ๊ธฐ ์ํด ๊ฐ ํฌ์ธํฐ์ ๋ณํ( )๊ฐ ์์์ ์ ์ ํ์ญ์์ค. ์ด๋ ์ฐ์ ์์ ๊ท์น์ผ๋ก ์ธํด ํ์ํฉ๋๋ค. ๋์ ์ฝ๋๊ฐ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ:int*int
int * p1, p2;
p1์ค์ ๋ก type int*์ด์ง๋ง p2type int์ ๋๋ค. ์ด ๋ชฉ์ ์ ์ํด ๊ณต๋ฐฑ์ ์ ํ ์ค์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด์จ๋ ํฌ์ธํฐ๋น ํ๋์ ๋ณํ๋ฅผ ๋ฃ๋ ๊ฒ๋ง ๊ธฐ์ตํ๋ฉด ๋ช ๋ น๋ฌธ๋น ์ฌ๋ฌ ํฌ์ธํฐ๋ฅผ ์ ์ธํ๋ ๋ฐ ๊ด์ฌ์ด ์๋ ๋๋ถ๋ถ์ ํฌ์ธํฐ ์ฌ์ฉ์์๊ฒ ์ถฉ๋ถํฉ๋๋ค. ๋๋ ๋ ๋์ ๋ฐฉ๋ฒ์ ๊ฐ ๋ณ์์ ๋ํด ๋ค๋ฅธ ๋ช ๋ น๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
ํฌ์ธํฐ์ ๋ฐฐ์ด
๋ฐฐ์ด์ ๊ฐ๋ ์ ํฌ์ธํฐ์ ๊ฐ๋ ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. ์ค์ ๋ก ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์์์ ๋ํ ํฌ์ธํฐ์ ๋งค์ฐ ์ ์ฌํ๊ฒ ์๋ํ๋ฉฐ ์ค์ ๋ก ๋ฐฐ์ด์ ํญ์ ์ ์ ํ ์ ํ์ ํฌ์ธํฐ๋ก ์์์ ์ผ๋ก ๋ณํ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์ ๋ ์ ์ธ์ ๊ณ ๋ คํ์ญ์์ค.
int myarray [20];
int * mypointer;
๋ค์ ํ ๋น ์์ ์ด ์ ํจํฉ๋๋ค.
mypointer = myarray;
๊ทธ ํ, mypointer๋ฐ myarray๋ ๋๋ฑํ๊ณ ๋งค์ฐ ์ ์ฌํ ์์ฑ์ ๊ฐ์ต๋๋ค. ์ฃผ์ ์ฐจ์ด์ ์ mypointer๋ค๋ฅธ ์ฃผ์๋ฅผ ํ ๋นํ ์ ์๋ ๋ฐ๋ฉด myarray์๋ฌด ๊ฒ๋ ํ ๋นํ ์ ์์ผ๋ฉฐ ํญ์ type ์ 20๊ฐ ์์๋ก ๊ตฌ์ฑ๋ ๋์ผํ ๋ธ๋ก์ ๋ํ๋ ๋๋ค int. ๋ฐ๋ผ์ ๋ค์ ํ ๋น์ ์ ํจํ์ง ์์ต๋๋ค.
myarray = mypointer;
๋ฐฐ์ด๊ณผ ํฌ์ธํฐ๋ฅผ ํผํฉํ๋ ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
// more pointers
#include <iostream>
using namespace std;
int main ()
{
int numbers[5];
int * p;
p = numbers; *p = 10;
p++; *p = 20;
p = &numbers[2]; *p = 30;
p = numbers + 3; *p = 40;
p = numbers; *(p+4) = 50;
for (int n=0; n<5; n++)
cout << numbers[n] << ", ";
return 0;
}
10, 20, 30, 40, 50,
ํฌ์ธํฐ์ ๋ฐฐ์ด์ ๋์ผํ ์์
์งํฉ์ ์ง์ํ๋ฉฐ ๋ ๋ค ๋์ผํ ์๋ฏธ๋ฅผ ๊ฐ์ต๋๋ค. ์ฃผ์ ์ฐจ์ด์ ์ ํฌ์ธํฐ์๋ ์ ์ฃผ์๋ฅผ ํ ๋นํ ์ ์์ง๋ง ๋ฐฐ์ด์๋ ํ ๋นํ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
๋ฐฐ์ด์ ๋ํ ์ฅ์์ ๋๊ดํธ( [])๋ ๋ฐฐ์ด ์์์ ์ธ๋ฑ์ค๋ฅผ ์ง์ ํ๋ ๊ฒ์ผ๋ก ์ค๋ช
๋์์ต๋๋ค. ์ฌ์ค ์ด ๋๊ดํธ๋ ์คํ์
์ฐ์ฐ์ ๋ก ์๋ ค์ง ์ญ์ฐธ์กฐ ์ฐ์ฐ์ ์
๋๋ค. ๊ทธ๋ค์ ๋ค๋ฐ๋ฅด๋ ๋ณ์๋ฅผ ์ญ์ฐธ์กฐํ๋ ๊ฒ์ฒ๋ผ ์ญ์ฐธ์กฐ *ํ์ง๋ง ์ญ์ฐธ์กฐ๋๋ ์ฃผ์์ ๋๊ดํธ ์ฌ์ด์ ์ซ์๋ฅผ ์ถ๊ฐํ๊ธฐ๋ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด:
a[5] = 0; // a [offset of 5] = 0
*(a+5) = 0; // pointed to by (a+5) = 0
์ด ๋ ํํ์์ if a๊ฐ ํฌ์ธํฐ์ผ ๋ฟ๋ง โโ์๋๋ผ if a๊ฐ ๋ฐฐ์ด์ธ ๊ฒฝ์ฐ์๋ ๋์ผํ๊ณ ์ ํจํฉ๋๋ค. ๋ฐฐ์ด์ธ ๊ฒฝ์ฐ ํด๋น ์ด๋ฆ์ ์ฒซ ๋ฒ์งธ ์์์ ๋ํ ํฌ์ธํฐ์ฒ๋ผ ์ฌ์ฉํ ์ ์์์ ๊ธฐ์ตํ์ญ์์ค.
ํฌ์ธํฐ ์ด๊ธฐํ
ํฌ์ธํฐ๊ฐ ์ ์๋๋ ๋ฐ๋ก ๊ทธ ์๊ฐ์ ํน์ ์์น๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํฌ์ธํฐ๋ฅผ ์ด๊ธฐํํ ์ ์์ต๋๋ค.
int myvar;
int * myptr = &myvar;
์ด ์ฝ๋ ์ดํ์ ๋ณ์์ ๊ฒฐ๊ณผ ์ํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
int myvar;
int * myptr;
myptr = &myvar;
ํฌ์ธํฐ๊ฐ ์ด๊ธฐํ๋ ๋ ์ด๊ธฐํ๋๋ ๊ฒ์ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์(์ฆ, myptr)์ด๋ฉฐ, ๊ฒฐ์ฝ ๊ฐ์ด ๊ฐ๋ฆฌํค์ง ์์ต๋๋ค(์ฆ, *myptr). ๋ฐ๋ผ์ ์์ ์ฝ๋๋ ๋ค์๊ณผ ํผ๋๋์ด์๋ ์ ๋ฉ๋๋ค.
int myvar;
int * myptr;
*myptr = &myvar;
์ด์จ๋ ๋ง์ ์๋ฏธ๊ฐ ์์ ๊ฒ์
๋๋ค (๊ทธ๋ฆฌ๊ณ ์ ํจํ ์ฝ๋๊ฐ ์๋๋๋ค).
ํฌ์ธํฐ ์ ์ธ(๋ผ์ธ 2) ์ ๋ณํ( *)๋ ํฌ์ธํฐ์์ ๋ํ๋ผ ๋ฟ์ด๋ฉฐ, ์ด๋ ์ญ์ฐธ์กฐ ์ฐ์ฐ์(๋ผ์ธ 3์์์ ๊ฐ์ด)๊ฐ ์๋๋๋ค. ๋ ๊ฐ์ง ๋ชจ๋ ๊ฐ์ ๊ธฐํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋ฐ์ํฉ๋๋ค *. . ํญ์ ๊ทธ๋ ๋ฏ์ด ๊ณต๋ฐฑ์ ๊ด๋ จ์ด ์์ผ๋ฉฐ ํํ์ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
ํฌ์ธํฐ๋ ๋ณ์์ ์ฃผ์(์์ ๊ฒฝ์ฐ์ ๊ฐ์ด) ๋๋ ๋ค๋ฅธ ํฌ์ธํฐ(๋๋ ๋ฐฐ์ด)์ ๊ฐ์ผ๋ก ์ด๊ธฐํ๋ ์ ์์ต๋๋ค.
int myvar;
int *foo = &myvar;
int *bar = foo;
ํฌ์ธํฐ ์ฐ์
ํฌ์ธํฐ์์ ์ฐ์ ์ฐ์ฐ์ ์ํํ๋ ๊ฒ์ ์ผ๋ฐ ์ ์ ์ ํ์์ ์ํํ๋ ๊ฒ๊ณผ ์ฝ๊ฐ ๋ค๋ฆ
๋๋ค. ์ฐ์ ๋ง์
๊ณผ ๋บ์
์ฐ์ฐ๋ง ํ์ฉ๋ฉ๋๋ค. ๋ค๋ฅธ ๊ฒ๋ค์ ํฌ์ธํฐ์ ์ธ๊ณ์์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ํ๊ธฐ์ ๋นผ๊ธฐ๋ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฐ์ดํฐ ์ ํ์ ํฌ๊ธฐ์ ๋ฐ๋ผ ํฌ์ธํฐ์ ์ฝ๊ฐ ๋ค๋ฅธ ๋์์ ํฉ๋๋ค.
๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ ํ์ด ๋์
๋์์ ๋ ์ ํ์ ํฌ๊ธฐ๊ฐ ์๋ก ๋ค๋ฅธ ๊ฒ์ ๋ณด์์ต๋๋ค. ์๋ฅผ ๋ค์ด: charํญ์ 1๋ฐ์ดํธ์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋ฉฐ ์ผ๋ฐ์ short์ผ๋ก ๊ทธ๋ณด๋ค ํฌ๋ฉฐ ํจ์ฌ ๋ ํฝ๋๋ค. ์ด๋ค์ ์ ํํ ํฌ๊ธฐ๋ ์์คํ
์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. ์๋ฅผ ๋ค์ด ์ฃผ์ด์ง ์์คํ
์์ 1๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํ๊ณ 2๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํ๊ณ 4๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.intlongcharshortlong
์ด์ ์ด ์ปดํ์ผ๋ฌ์์ ์ธ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ์ ์ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
char *mychar;
short *myshort;
long *mylong;
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๋ค์ด ๊ฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์์น 1000, 2000, ๋ฅผ ๊ฐ๋ฆฌํจ๋ค๋ ๊ฒ์ ์๊ณ 3000์์ต๋๋ค.
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ฉด
++mychar;
++myshort;
++mylong;
mychar, ์์๋๋ก ๊ฐ 1001์ ํฌํจํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ช ํํ์ง ์์ ๊ฒ์ myshort๊ฐ 2002๋ฅผ ํฌํจํ๊ณ mylong๊ฐ๊ฐ์ด ํ ๋ฒ๋ง ์ฆ๊ฐํ์์๋ ๋ถ๊ตฌํ๊ณ 3004๋ฅผ ํฌํจํฉ๋๋ค. ๊ทธ ์ด์ ๋ ํฌ์ธํฐ์ 1์ ์ถ๊ฐํ ๋ ๋์ผํ ์ ํ์ ๋ค์ ์์๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํฌ์ธํฐ๊ฐ ๋ง๋ค์ด์ง๊ธฐ ๋๋ฌธ์ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์ ํ์ ๋ฐ์ดํธ ๋จ์ ํฌ๊ธฐ๊ฐ ํฌ์ธํฐ์ ์ถ๊ฐ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด๊ฒ์ ํฌ์ธํฐ์ ์ซ์๋ฅผ ๋ํ๊ฑฐ๋ ๋บ ๋ ๋ชจ๋ ์ ์ฉ๋ฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ฉด ์ ํํ ๋์ผํ๊ฒ ๋ฐ์ํฉ๋๋ค.
mychar = mychar + 1;
myshort = myshort + 1;
mylong = mylong + 1;
์ฆ๊ฐ( ++) ๋ฐ ๊ฐ์( --) ์ฐ์ฐ์์ ๊ด๋ จํ์ฌ ๋ ๋ค ์์ ์ ๋์ฌ ๋๋ ์ ๋ฏธ์ฌ๋ก ์ฌ์ฉํ ์ ์์ง๋ง ๋์์ ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์ ๋์ฌ๋ก ์ฆ๋ถ์ ์์ ํ๊ฐํ๊ธฐ ์ ์ ๋ฐ์ํ๊ณ ์ ๋ฏธ์ฌ๋ก, ์ฆ๋ถ์ ํํ์์ด ํ๊ฐ๋ ํ์ ๋ฐ์ํฉ๋๋ค. *์ด๋ ํฌ์ธํฐ ์ฆ๊ฐ ๋ฐ ๊ฐ์ ํํ์์๋ ์ ์ฉ๋๋ฉฐ, ์ด๋ ์ญ์ฐธ์กฐ ์ฐ์ฐ์( ) ๋ ํฌํจํ๋ ๋ ๋ณต์กํ ํํ์์ ์ผ๋ถ๊ฐ ๋ ์ ์์ต๋๋ค . ์ฐ์ฐ์ ์ฐ์ ์์ ๊ท์น์ ๊ธฐ์ตํ๋ฉด ์ฆ๊ฐ ๋ฐ ๊ฐ์์ ๊ฐ์ ํ์ ์ฐ์ฐ์๊ฐ ์ญ์ฐธ์กฐ ์ฐ์ฐ์( *)์ ๊ฐ์ ์ ๋ ์ฐ์ฐ์๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๋ค๋ ๊ฒ์ ๊ธฐ์ตํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ค์ ํํ์:
*p++
์ ๋์ผํฉ๋๋ค *(p++). ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ํ๋ ์ผ์ p(์ด์ ๋ค์ ์์๋ฅผ ๊ฐ๋ฆฌํค๋๋ก) ์ ๊ฐ์ ๋์ด๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ++๊ฐ ์ ๋ฏธ์ฌ๋ก ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ์ ์ฒด ํํ์์ ์๋ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ผ๋ก ํ๊ฐ๋ฉ๋๋ค(์ฆ๊ฐ๋๊ธฐ ์ ์ ๊ฐ๋ฆฌํจ ์ฃผ์). ).
๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์์ ์ฆ๊ฐ ์ฐ์ฐ์์ ์ ๋์ฌ ๋ฐ ์ ๋ฏธ์ฌ ๋ฒ์ ์ด ์๋ ์ญ์ฐธ์กฐ ์ฐ์ฐ์์ ๋ค ๊ฐ์ง ๊ฐ๋ฅํ ์กฐํฉ์
๋๋ค(๊ฐ์ ์ฐ์ฐ์์๋ ๋์ผํ๊ฒ ์ ์ฉ๋จ).
*p++ // same as *(p++): increment pointer, and dereference unincremented address
*++p // same as *(++p): increment pointer, and dereference incremented address
++*p // same as ++(*p): dereference pointer, and increment the value it points to
(*p)++ // dereference pointer, and post-increment the value it points to
์ด๋ฌํ ์ฐ์ฐ์์ ๊ด๋ จ๋ ์ผ๋ฐ์ ์ด์ง๋ง ๊ทธ๋ ๊ฒ ๊ฐ๋จํ์ง ์์ ๋ช ๋ น๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
*p++ = *q++;
๋ฐ ๋ชจ๋ ++๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๊ธฐ ๋๋ฌธ์ ์ฆ๋ถ ์ฐ์ฐ์( )๋ ์ ๋์ฌ๊ฐ ์๋๋ผ ์ ๋ฏธ์ฌ๋ก ์ฌ์ฉ๋๋ฏ๋ก ์ ํ ๋น๋ ๊ฐ ์ ๋ ๋ค ์์ ์๊ณ ์ฆ๋ถ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ ๋ค ์ฆ๊ฐํฉ๋๋ค. ๋๋ต ๋ค์๊ณผ ๊ฐ์ต๋๋ค.*pq++*p*qpq
*p = *q;
++p;
++q;
ํญ์ ๊ทธ๋ ๋ฏ์ด ๊ดํธ๋ ํํ์ ๊ฐ๋ ์ฑ์ ๋ํ์ฌ ํผ๋์ ์ค์ ๋๋ค.
ํฌ์ธํฐ์ const
ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ์ฃผ์๋ก ๋ณ์์ ์ก์ธ์คํ ์ ์์ผ๋ฉฐ ์ด ์ก์ธ์ค์๋ ๊ฐ๋ฆฌํค๋ ๊ฐ ์์ ์ด ํฌํจ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํฌ์ธํฐ ๊ฐ์ ์ฝ๊ธฐ ์ํด ์ก์ธ์คํ ์ ์์ง๋ง ์์ ํ ์๋ ์๋ ํฌ์ธํฐ๋ฅผ ์ ์ธํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ฅผ ์ํด์๋ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์ ํ์ ๋ก ํ์ ํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค const. ์๋ฅผ ๋ค์ด:
int x;
int y = 10;
const int * p = &y;
x = *p; // ok: reading p
*p = x; // error: modifying p, which is const-qualified
์ฌ๊ธฐ p์์ ๋ณ์๋ฅผ ๊ฐ๋ฆฌ ํค์ง๋ง constํ์ ๋ ๋ฐฉ์์ผ๋ก ๊ฐ๋ฆฌํต๋๋ค. ์ฆ, ๊ฐ๋ฆฌํจ ๊ฐ์ ์ฝ์ ์๋ ์์ง๋ง ์์ ํ ์๋ ์์ต๋๋ค. ๋ํ ํํ์ &y์ type int*์ด์ง๋ง type ์ ํฌ์ธํฐ์ ํ ๋น๋ฉ๋๋ค const int*. ์ด๊ฒ์ ํ์ฉ๋ฉ๋๋ค: ๋น const์ ๋ํ ํฌ์ธํฐ๋ ์์์ ์ผ๋ก const์ ๋ํ ํฌ์ธํฐ๋ก ๋ณํ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ๋ฐ๋๋ ์๋๋๋ค! ์์ ๊ธฐ๋ฅ์ผ๋ก ์ ๋ํ ํฌ์ธํฐ const๋ ์์์ ์ผ๋ก non- ์ ๋ํ ํฌ์ธํฐ๋ก ๋ณํํ ์ ์์ต๋๋ค const.
์์ ์ ๋ํ ํฌ์ธํฐ์ ์ฌ์ฉ ์ฌ๋ก ์ค ํ๋๋ constํจ์ ๋งค๊ฐ๋ณ์์
๋๋ค. ๋งค๊ฐ๋ณ์๊ฐ ์๋ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉ constํ๋ ํจ์๋ ์ธ์๋ก ์ ๋ฌ๋ ๊ฐ์ ์์ ํ ์ ์์ง๋ง ํฌ์ธํฐ๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ๋ ํจ์๋ ์์ ํ const์ ์์ต๋๋ค.
// pointers as arguments:
#include <iostream>
using namespace std;
void increment_all (int* start, int* stop)
{
int * current = start;
while (current != stop) {
++(*current); // increment value pointed
++current; // increment pointer
}
}
void print_all (const int* start, const int* stop)
{
const int * current = start;
while (current != stop) {
cout << *current << '\n';
++current; // increment pointer
}
}
int main ()
{
int numbers[] = {10,20,30};
increment_all (numbers,numbers+3);
print_all (numbers,numbers+3);
return 0;
}
11
21
31
print_all์์ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค . ์ด๋ฌํ ํฌ์ธํฐ๋ ์์ ํ ์ ์๋ ์์ ๋ด์ฉ์ ๊ฐ๋ฆฌํค์ง๋ง ์์ฒด์ ์ผ๋ก๋ ์ผ์ ํ์ง ์์ต๋๋ค. ์ฆ, ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ด์ฉ์ ์์ ํ ์๋ ์์ง๋ง ํฌ์ธํฐ๋ ๊ณ์ ์ฆ๊ฐํ๊ฑฐ๋ ๋ค๋ฅธ ์ฃผ์๋ฅผ ํ ๋นํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ constness์ ๋ํ ๋ ๋ฒ์งธ ์ฐจ์์ด ํฌ์ธํฐ์ ์ถ๊ฐ๋๋ ๊ณณ์
๋๋ค. ํฌ์ธํฐ ์์ฒด๋ const์ผ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ const๋ฅผ ํฌ์ธํธ ํ์
(๋ณํ ๋ค)์ ์ถ๊ฐํ์ฌ ์ง์ ํฉ๋๋ค.
int x;
int * p1 = &x; // non-const pointer to non-const int
const int * p2 = &x; // non-const pointer to const int
int * const p3 = &x; // const pointer to non-const int
const int * const p4 = &x; // const pointer to const int
๋ฐ ํฌ์ธํฐ ์ ๊ตฌ๋ฌธ const์ ํ์คํ ๊น๋ค๋ก์ฐ๋ฉฐ ๊ฐ ์ฉ๋์ ๊ฐ์ฅ ์ ํฉํ ๊ฒฝ์ฐ๋ฅผ ์ธ์ํ๋ ค๋ฉด ์ฝ๊ฐ์ ๊ฒฝํ์ด ํ์ํ ๊ฒฝํฅ์ด ์์ต๋๋ค. ์ด์จ๋ , ํฌ์ธํฐ(๋ฐ ์ฐธ์กฐ)์ ๋ํ ์ผ๊ด์ฑ์ ๋์ค์ ๋ณด๋ค ๋นจ๋ฆฌ ์ป๋ ๊ฒ์ด ์ค์ํ์ง๋ง, ํฌ์ธํฐ์ ํฌ์ธํฐ์ ์กฐํฉ์ ์ฒ์ ๋
ธ์ถ๋๋ ๊ฒฝ์ฐ ๋ชจ๋ ๊ฒ์ ํ์
ํ๋ ๊ฒ์ ๋ํด ๋๋ฌด ๊ฑฑ์ ํ ํ์๋ ์์ต๋๋ค const. ๋ค์ ์ฅ์์ ๋ ๋ง์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ๋ํ๋ ๊ฒ์
๋๋ค. with ํฌ์ธํฐ
์ ๊ตฌ๋ฌธ์ ์ฝ๊ฐ์ ํผ๋์ ๋ํ๊ธฐ ์ํด ํ์ ์๋ ์ ํํ ๊ฐ์ ์๋ฏธ๋ก ๋พฐ์กฑํ ์ ํ ์์ด๋ ๋ค์ ์ฌ ์ ์์ต๋๋ค.
const int * p2a = &x; // non-const pointer to const int
int const * p2b = &x; // also non-const pointer to const int
๋ณํ๋ฅผ ๋๋ฌ์ผ ๊ณต๋ฐฑ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด ๊ฒฝ์ฐ const์ ์์๋ ๋จ์ํ ์คํ์ผ์ ๋ฌธ์ ์ ๋๋ค. ์ด ์ฅ์์๋ ์ ๋์ฌ const๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ญ์ฌ์ ์ด์ ๋ก ์ด๊ฒ์ด ๋ ํ์ฅ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ๋ ๋ค ์ ํํ ๋์ผํฉ๋๋ค. ๊ฐ ์คํ์ผ์ ์ฅ์ ์ ์ฌ์ ํ โโ์ธํฐ๋ท์์ ์น์ดํ๊ฒ ๋ ผ์๋๊ณ ์์ต๋๋ค.
ํฌ์ธํฐ์ ๋ฌธ์์ด ๋ฆฌํฐ๋ด
์์์ ์ง์ ํ๋ฏ์ด ๋ฌธ์์ด ๋ฆฌํฐ๋ด ์ null๋ก ๋๋๋ ๋ฌธ์ ์ํ์ค๋ฅผ ํฌํจํ๋ ๋ฐฐ์ด์
๋๋ค. ์ด์ ์น์
์์ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ์ ์ง์ ์ฝ์
๋์ด cout๋ฌธ์์ด์ ์ด๊ธฐํํ๊ณ ๋ฌธ์ ๋ฐฐ์ด์ ์ด๊ธฐํํ๋ ๋ฐ ์ฌ์ฉ๋์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ง์ ์ก์ธ์คํ ์๋ ์์ต๋๋ค. ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ๋ชจ๋ ๋ฌธ์์ ์ข
๋ฃ null ๋ฌธ์๋ฅผ ํฌํจํ๋ ์ ์ ํ ๋ฐฐ์ด ์ ํ์ ๋ฐฐ์ด์ด๋ฉฐ, ๊ฐ ์์๋ ์ ํ const char(๋ฆฌํฐ๋ด์ด๋ฏ๋ก ์์ ํ ์ ์์)์
๋๋ค. ์๋ฅผ ๋ค์ด:
const char * foo = "hello";
์ด๊ฒ์ ์ ๋ํ ๋ฆฌํฐ๋ด ํํ์ผ๋ก ๋ฐฐ์ด์ ์ ์ธํ "hello"๋ค์ ์ฒซ ๋ฒ์งธ ์์์ ๋ํ ํฌ์ธํฐ๊ฐ ์ ํ ๋น๋ฉ๋๋ค foo. ๊ทธ๊ฒ์ด ์ฃผ์ 1702์์ ์์ํ๋ ๋ฉ๋ชจ๋ฆฌ ์์น์ ์ ์ฅ๋์ด ์๋ค๊ณ ์์ ํ๋ฉด ์ด์ ์ ์ธ์ ๋ค์ ๊ณผ "hello"๊ฐ์ด ๋ํ๋ผ ์ ์์ต๋๋ค.
์ฌ๊ธฐ foo์ ํฌ์ธํฐ๊ฐ ์๊ณ ๊ฐ 1702๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. 1702๋ ์ค์ ๋ก ๋ ์ฃผ์ ๋ชจ๋ ์ด๊ฒ๋ค. ํฌ์ธํฐ ๋ ์ผ๋ จ์ ๋ฌธ์๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. ํฌ์ธํฐ์ ๋ฐฐ์ด์ ํํ์์์ ๋ณธ์ง์ ์ผ๋ก ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ null๋ก ๋๋๋ ๋ฌธ์ ์ํ์ค์ ๋ฐฐ์ด๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ฌธ์์ ์ก์ธ์คํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด:'h'"hello"
*(foo+4)
foo[4]
๋ ํํ์ ๋ชจ๋ 'o'(๋ฐฐ์ด์ ๋ค์ฏ ๋ฒ์งธ ์์) ๊ฐ์ ๊ฐ์ต๋๋ค.
ํฌ์ธํฐ์ ๋ํ ํฌ์ธํฐ
C++์์๋ ํฌ์ธํฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด ํฌ์ธํฐ๋ ์ฐจ๋ก๋ก ๋ฐ์ดํฐ(๋๋ ๋ค๋ฅธ ํฌ์ธํฐ๋ ๊ฐ๋ฆฌํด)๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. ๊ตฌ๋ฌธ *์๋ ํฌ์ธํฐ ์ ์ธ์ ๊ฐ ๊ฐ์ ์ฐธ์กฐ ์์ค์ ๋ํด ๋ณํ( )๊ฐ ํ์ํฉ๋๋ค.
char a;
char * b;
char ** c;
a = 'z';
b = &a;
c = &b;
7230์ด๊ฒ์ , 8092, ๋ฐ ์ ๊ฐ ๋ณ์์ ๋ํด ์์๋ก ์ ํ๋ ๋ฉ๋ชจ๋ฆฌ ์์น๋ฅผ 10502๋ค์๊ณผ ๊ฐ์ด ๋ํ๋ผ ์ ์์ต๋๋ค.
๊ฐ ๋ณ์์ ๊ฐ์ ํด๋น ์
๋ด๋ถ์ ํ์๋๊ณ ๋ฉ๋ชจ๋ฆฌ์ ํด๋น ์ฃผ์๋ ๊ทธ ์๋ ๊ฐ์ผ๋ก ํ์๋ฉ๋๋ค.
์ด ์์ ์ ์๋ก์ด ์ ์ cํฌ์ธํฐ์ ๋ํ ํฌ์ธํฐ์ธ variable ์ด๋ฉฐ ์ธ ๊ฐ์ง ๋ค๋ฅธ ๊ฐ์ ์ฐธ์กฐ ์์ค์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๊ฐ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ ํด๋นํฉ๋๋ค.
- c์ ํ char**๋ฐ ๊ฐ8092
- *c์ ํ char*๋ฐ ๊ฐ7230
- **c์ ํ char๋ฐ ๊ฐ'z'
void pointer
ํฌ์ธํฐ ์ void์ ํ์ ํน๋ณํ ์ ํ์ ํฌ์ธํฐ์
๋๋ค. C++์์ void์ ํ์ด ์์์ ๋ํ๋
๋๋ค. ๋ฐ๋ผ์ voidํฌ์ธํฐ๋ ์ ํ์ด ์๋ ๊ฐ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ์
๋๋ค.
์ด๊ฒ์ void์ ์ ๊ฐ์ด๋ ๋ถ๋ ์์์ ์์ ๋ฌธ์์ด์ ์ด๋ฅด๊ธฐ๊น์ง ๋ชจ๋ ๋ฐ์ดํฐ ์ ํ์ ๊ฐ๋ฆฌํฌ ์ ์์ผ๋ฏ๋ก ํฌ์ธํฐ์ ํฐ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ ๋๊ฐ๋ก ๊ทธ๊ฒ๋ค์ ํฐ ํ๊ณ๊ฐ ์์ต๋๋ค: ๊ทธ๋ค์ด ๊ฐ๋ฆฌํค๋ ๋ฐ์ดํฐ๋ ์ง์ ์ญ์ฐธ์กฐ๋ ์ ์์ผ๋ฉฐ(์ญ์ฐธ์กฐํ ์ ํ์ด ์๊ธฐ ๋๋ฌธ์ ๋
ผ๋ฆฌ์ ์
๋๋ค), ๊ทธ๋ฐ ์ด์ ๋ก voidํฌ์ธํฐ์ ๋ชจ๋ ์ฃผ์๋ ์ผ๋ถ ์ฃผ์๋ก ๋ณํ๋์ด์ผ ํฉ๋๋ค. ์ญ์ฐธ์กฐ๋๊ธฐ ์ ์ ๊ตฌ์ฒด์ ์ธ ๋ฐ์ดํฐ ์ ํ์ ๊ฐ๋ฆฌํค๋ ๋ค๋ฅธ ํฌ์ธํฐ ์ ํ.
๊ฐ๋ฅํ ์ฉ๋ ์ค ํ๋๋ ํจ์์ ์ผ๋ฐ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด:
// increaser
#include <iostream>
using namespace std;
void increase (void* data, int psize)
{
if ( psize == sizeof(char) )
{ char* pchar; pchar=(char*)data; ++(*pchar); }
else if (psize == sizeof(int) )
{ int* pint; pint=(int*)data; ++(*pint); }
}
int main ()
{
char a = 'x';
int b = 1602;
increase (&a,sizeof(a));
increase (&b,sizeof(b));
cout << a << ", " << b << '\n';
return 0;
}
์, 1603
sizeof์ธ์์ ํฌ๊ธฐ๋ฅผ ๋ฐ์ดํธ ๋จ์๋ก ๋ฐํํ๋ C++ ์ธ์ด์ ํตํฉ๋ ์ฐ์ฐ์์ ๋๋ค. ๋น๋์ ๋ฐ์ดํฐ ์ ํ์ ๊ฒฝ์ฐ ์ด ๊ฐ์ ์์์ ๋๋ค. ๋ฐ๋ผ์ ์๋ฅผ ๋ค์ด ๋ ํญ์ 1๋ฐ์ดํธ ํฌ๊ธฐ๋ฅผ sizeof(char)๊ฐ๊ธฐ ๋๋ฌธ์ 1 ์ ๋๋ค.char
์ ํจํ์ง ์์ ํฌ์ธํฐ ๋ฐ ๋ ํฌ์ธํฐ
์์น์ ์ผ๋ก ํฌ์ธํฐ๋ ๋ณ์์ ์ฃผ์๋ ๋ฐฐ์ด ์์์ ์ฃผ์์ ๊ฐ์ ์ ํจํ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. ๊ทธ๋ฌ๋ ํฌ์ธํฐ๋ ์ ํจํ ์์๋ฅผ ์ฐธ์กฐํ์ง ์๋ ์ฃผ์๋ฅผ ํฌํจํ์ฌ ์ค์ ๋ก ๋ชจ๋ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์์ต๋๋ค. ์ด์ ๋ํ ์ผ๋ฐ์ ์ธ ์๋ ์ด๊ธฐํ๋์ง ์์ ํฌ์ธํฐ ์ ๋ฐฐ์ด์ ์กด์ฌํ์ง ์๋ ์์์ ๋ํ ํฌ์ธํฐ์ ๋๋ค.
int * p; // uninitialized pointer (local variable)
int myarray[10];
int * q = myarray+20; // element out of bounds
p๊ฐ์ ํฌํจํ๋ ๊ฒ์ผ๋ก ์๋ ค์ง ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค ๊ฑฐ๋ ๊ฐ๋ฆฌํค์ง ์์ง๋ง ์์ ๋ช
๋ น๋ฌธ ์ค ์ด๋ q๊ฒ๋ ์ค๋ฅ๋ฅผ ์ผ์ผํค์ง ์์ต๋๋ค. C++์์ ํฌ์ธํฐ๋ ํด๋น ์ฃผ์์ ์ค์ ๋ก ๋ฌด์ธ๊ฐ๊ฐ ์๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋ชจ๋ ์ฃผ์ ๊ฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ค๋ฅ๋ฅผ ์ผ์ผํฌ ์ ์๋ ๊ฒ์ ๊ทธ๋ฌํ ํฌ์ธํฐ๋ฅผ ์ญ์ฐธ์กฐํ๋ ๊ฒ์
๋๋ค(์ฆ, ์ค์ ๋ก ๊ฐ๋ฆฌํค๋ ๊ฐ์ ์ก์ธ์คํ๋ ๊ฒฝ์ฐ). ์ด๋ฌํ ํฌ์ธํฐ์ ์ก์ธ์คํ๋ฉด ๋ฐํ์ ์ค ์ค๋ฅ์์ ์์์ ๊ฐ์ ์ก์ธ์คํ๋ ๊ฒ์ ์ด๋ฅด๊ธฐ๊น์ง ์ ์๋์ง ์์ ๋์์ด ๋ฐ์ํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋๋๋ก ํฌ์ธํฐ๋ ์ ํจํ์ง ์์ ์ฃผ์๊ฐ ์๋๋ผ ๋ช
์์ ์ผ๋ก ์๋ฌด๋ฐ๋ ๊ฐ๋ฆฌํฌ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌํ ๊ฒฝ์ฐ, ๋ชจ๋ ํฌ์ธํฐ ์ ํ์ด ์ทจํ ์ ์๋ ํน๋ณํ ๊ฐ์ด ์์ต๋๋ค: null ํฌ์ธํฐ ๊ฐ . ์ด ๊ฐ์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก C++์์ ํํํ ์ ์์ต๋๋ค. ์ ์ ๊ฐ 0 ๋๋nullptr์์ด:
int * p = 0;
int * q = nullptr;
์ฌ๊ธฐ์์ p๋ฐ ๋ q๋ค null ํฌ์ธํฐ ์ ๋๋ค. ์ฆ, ๋ช ์์ ์ผ๋ก ์๋ฌด ๊ณณ๋ ๊ฐ๋ฆฌํค์ง ์์ผ๋ฉฐ ์ค์ ๋ก ๋ ๋ค ๋์ผํ๊ฒ ๋น๊ต๋ฉ๋๋ค. ๋ชจ๋ null ํฌ์ธํฐ ๋ ๋ค๋ฅธ null ํฌ์ธํฐ ์ ๋์ผํ๊ฒ ๋น๊ต ๋ฉ๋๋ค. null ํฌ์ธํฐ ๊ฐ NULL์ ์ฐธ์กฐํ๊ธฐ ์ํด ์ด์ ์ฝ๋์์ ์ ์๋ ์์๊ฐ ์ฌ์ฉ๋๋ ๊ฒ์ ๋ณด๋ ๊ฒ๋ ๋งค์ฐ ์ผ๋ฐ์ ์ ๋๋ค .
int * r = NULL;
NULLํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ๋ฌ ํค๋์ ์ ์๋์ด ์์ผ๋ฉฐ ์ผ๋ถ null ํฌ์ธํฐ ์์ ๊ฐ(์: 0๋๋ nullptr)์ ๋ณ์นญ์ผ๋ก ์ ์๋ฉ๋๋ค. ๋ ํฌ์ธํฐ ์ ํฌ์ธํฐ๋ฅผ
ํผ๋ํ์ง ๋ง์ญ์์ค ! ๋ ํฌ์ธํฐ ๋ ํฌ์ธํฐ๊ฐ "์๋ฌด๋ฐ๋"๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์์ ๋ํ๋ด๊ธฐ ์ํด ์ทจํ ์ ์๋ ๊ฐ์ด๊ณ , ํฌ์ธํฐ ๋ ํน์ ์ ํ ์์ด ์ด๋๊ฐ๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์๋ ํฌ์ธํฐ ์ ํ์
๋๋ค. ํ๋๋ ํฌ์ธํฐ์ ์ ์ฅ๋ ๊ฐ์ ์ฐธ์กฐํ๊ณ ๋ค๋ฅธ ํ๋๋ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฐ์ดํฐ ์ ํ์ ๋ํ๋
๋๋ค.voidvoid
ํจ์์ ๋ํ ํฌ์ธํฐ
C++์์๋ ํจ์์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ ์ํํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ผ๋ฐ์ ์ธ ์ฉ๋๋ ํจ์๋ฅผ ๋ค๋ฅธ ํจ์์ ๋ํ ์ธ์๋ก ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค. ํจ์์ ๋ํ ํฌ์ธํฐ๋ ์ผ๋ฐ ํจ์ ์ ์ธ๊ณผ ๋์ผํ ๊ตฌ๋ฌธ์ผ๋ก ์ ์ธ๋ฉ๋๋ค. ๋จ, ํจ์ ์ด๋ฆ์ ๊ดํธ()๋ก ๋ฌถ์ด๊ณ *์ด๋ฆ ์์ ๋ณํ( )๊ฐ ์ฝ์ ๋ฉ๋๋ค.
// pointer to functions
#include <iostream>
using namespace std;
int addition (int a, int b)
{ return (a+b); }
int subtraction (int a, int b)
{ return (a-b); }
int operation (int x, int y, int (*functocall)(int,int))
{
int g;
g = (*functocall)(x,y);
return (g);
}
int main ()
{
int m,n;
int (*minus)(int,int) = subtraction;
m = operation (7, 5, addition);
n = operation (20, m, minus);
cout <<n;
return 0;
}
8
์์ ์์์ minus๋ ์ ํ์ ๋งค๊ฐ๋ณ์๊ฐ ๋ ๊ฐ ์๋ ํจ์์ ๋ํ ํฌ์ธํฐ์ ๋๋ค int. ํจ์๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์ง์ ์ด๊ธฐํ๋ฉ๋๋ค subtraction.
int (* minus)(int,int) = subtraction;
'๐ Development Study > ๐จ๐พโ๐ป C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ตฌ์กฐ์ฒด (0) | 2022.08.19 |
---|---|
๋์ ๋ฉ๋ชจ๋ฆฌ (0) | 2022.08.19 |
๋ฌธ์์ด (0) | 2022.08.19 |
๋ฐฐ์ด (0) | 2022.08.19 |
namespace (0) | 2022.08.18 |
๋๊ธ