๋ฐฐ์ด๊ณผ ํฌ์ธํฐ์ ๊ด๊ณ: Relationship Between Arrays and Pointers
๋ฐฐ์ด๊ณผ ํฌ์ธํฐ๋ฅผ ๋ ๋ค ์ผ์ถ ์ดํดํ๊ฒ ๋๋ฉด, ํ๊ฐ์ง ๊ณตํต์ ์ ์๊ฒ ๋ฉ๋๋ค.
๋ฐฐ์ด์ ์ด๋ฆ์ด ์ด๋ค ๊ฒ์ ์๋ฏธํ๋์ง ๊ธฐ์ตํ๊ณ ๊ณ์๋์?
๋ฐ๋ก '๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ๋ฐ์ดํฐ์ ์ฃผ์๊ฐ'์ ๋ํ๋ ๋๋ค.
๊ทธ๋ฆฌ๊ณ , ํฌ์ธํฐ ๋ณ์์ ๊ฐ์ ์ฃผ์๊ฐ์ด์์ต๋๋ค.
์ด๋ ๊ฒ ๋ณด๋ฉด ์ฌ์ค์ ๋ฐฐ์ด์ ์ด๋ฆ๊ณผ ํฌ์ธํฐ๋ ๋์ผํ ๊ฒ ๊ฐ์ง ์๋์?
์ค์ ๋ก ๋ง์ฝ ํฌ์ธํฐ๊ฐ ๋ฐฐ์ด์ ์์์ ๋์ผํ ํ์ ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด,
ํฌ์ธํฐ์ ๋ฐฐ์ด์ ์ํธ๊ตํ์ ์ผ๋ก, (์ฌ์ค์) ๋์ผํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฐ๋จํ ์ฝ๋๋ก ์ด๋ฅผ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
int scores[]{100, 90, 80};
cout << "Print scores: " << scores << endl; // 0x16f11b138 (์ฃผ์)
cout << "Print *scores: " << *scores << endl; // 100
int *score_ptr{scores};
cout << "Print score_ptr: " << score_ptr << endl; // 0x16f11b138 (์ฃผ์)
cout << "Print *score_ptr: " << *score_ptr << endl; // 100
๋ฐฐ์ด์ ์ด๋ฆ scores์ score_ptr ํฌ์ธํฐ๊ฐ ๋์ผํ ๊ธฐ๋ฅ์ ์ํํ๊ณ ์์์ ์ ์ ์์ต๋๋ค.
๊ฐ ์์์๋ ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ทผํ ์ ์๋์ง ํ์ธํด๋ณผ๊น์?
int scores[]{100, 90, 80};
int *score_ptr{scores};
cout << score_ptr[0] << endl; // 100
cout << scores[0] << endl; // 100
cout << score_ptr[1] << endl; // 90
cout << scores[1] << endl; // 90
cout << score_ptr[2] << endl; // 80
cout << scores[2] << endl; // 80
์ ํํ๊ฒ ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ํ ์ ์์์ต๋๋ค.
cout << *score_ptr << endl; // 100
cout << *(score_ptr + 1) << endl; // 90
cout << *(score_ptr + 2) << endl; // 80
์ด๋ฐ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.
์ด๊ฒ ์ด๋ป๊ฒ ๊ฐ๋ฅํ์ง๋ ์ ํฌ์คํธ ์ค ๋ฐฐ์ด์ ๊ด๋ จ๋ ํฌ์คํธ์์ ๋๋ต ์๊ฐ๊ฐ ๋์ด์์ต๋๋ค.
๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ฌ์ง์ด ๊ด๋ จ๋ ์ค๋ช ๋ถ๋ถ์ ๋๋ค.
sizeof(int) = 4 ์ด๋ฏ๋ก, ์ ์ ๋ฐฐ์ด์ ๊ฐ ์์์ธ ์ ์ ํ๋ ๋น 4์ ๋ฐ์ดํธ๋ฅผ ์ฐจ์งํฉ๋๋ค.
์์ ์์์์๋ ๊ฐ์ ๊ฐ๋ ์ด ์ ์ฉ๋์์ต๋๋ค.
*score_ptr = score_ptr ์ ์ฃผ์ = scores ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ๊ฐ (100) ์ ์ฃผ์ ์ ๋๋ค.
์ด๋ฅผ 0x16...10 ์ด๋ผ๊ณ ๊ฐ์ ํ์ ๋,
*(score_ptr + 1) = 0x16...10 + 4 = 0x...14
*(score_ptr + 2) = 0x16...10 + 4 + 4 = 0x...18
*(score_ptr + 3) = 0x16...10 + 4 + 4 + 4 = 0x...22
...
์ด๋ฐ ์์ผ๋ก ์งํ๋ฉ๋๋ค.
asterisk๋ฅผ ๋ผ๊ณ ์ง์ ์ ์ผ๋ก ์ฃผ์๋ฅผ ํ๋ฒ ์ฝ์ด๋ณผ๊น์?
int scores[]{100, 90, 80, 70};
int *score_ptr{scores};
cout << score_ptr << endl; // 0x16b00f130
cout << (score_ptr + 1) << endl; // 0x16b00f134
cout << (score_ptr + 2) << endl; // 0x16b00f138
0x16...30, 0x16...34, 0x16...38
๋ก 4์ฉ ์ฆ๊ฐํ๋๊ฒ ๋ณด์ด์ค ๊ฒ๋๋ค.
์ฆ, ํ๋์ ํํ์ผ๋ก ์ ๋ฆฌํ์๋ฉด
array_name ๋ฐฐ์ด๊ณผ ๊ทธ ๋ฐฐ์ด์ ๊ฐ๋ฅดํค๋ pointer_name ํฌ์ธํฐ์ ๋ํด์,
array_name[index] = *(array_name + index)
pointer_name[index] = *(pointer_name + index)
์ ๋๋ค.
'C++ > ํฌ์ธํฐ (Pointers)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++] ์์์ ํฌ์ธํฐ (Pointers to Constants) (0) | 2023.12.22 |
---|---|
[C++] ํฌ์ธํฐ ์ฐ์ฐ/์ฐ์ (Pointer Arithmetic) (0) | 2023.12.19 |
[C++] ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น (Dynamic Memory Allocation) (1) | 2023.12.19 |
[C++] ์ญ์ฐธ์กฐ (Dereferencing a Pointer) (0) | 2023.12.19 |
[C++] ๋ฐ์ดํฐ์ ์ฃผ์์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ (1) | 2023.12.19 |