Language/C++

[ C++ ] ํฌ์ธํ„ฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

ma.caron_g 2024. 4. 2. 11:09

์ฐธ๊ณ  ์‚ฌ์ดํŠธ

• ์†Œ๋…„์ฝ”๋”ฉ๋‹˜์˜ ํ‹ฐ์Šคํ† ๋ฆฌ

 

 

 

 

๐Ÿซต๐Ÿป ํฌ์ธํ„ฐ

๋ณ€์ˆ˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์ด๋ผ๊ณ  ์•ž์„œ ๊ฒŒ์‹œ๊ธ€์—์„œ ์„ค๋ช…ํ•˜์˜€๋‹ค.

์ด๋•Œ,  ๋‹ด๊ธฐ๋Š” ๊ณต๊ฐ„์€ ์ปดํ“จํ„ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ์ด๋ฉฐ, ํ•ด๋‹น ๋ณ€์ˆ˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์–ด๋””์— ์œ„์น˜ํ•ด์žˆ๋Š”์ง€ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.

 

๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์‹œ์ž‘ ์ฃผ์†Œ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜๋ฅผ ํฌ์ธํ„ฐ๋ผ๊ณ  ํ•œ๋‹ค.

 

 

โญ ํฌ์ธํ„ฐ ์„ ์–ธ

ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋Š” ์ผ๋ฐ˜ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์„ ์–ธ๋˜๋ฉฐ, ์ž๋ฃŒํ˜•๊ณผ ๋ณ€์ˆ˜ ์ด๋ฆ„ ๋˜๋Š” ๊ทธ ์‚ฌ์ด์— ( * )์ด ๋ถ™๋Š”๋‹ค.

#include <iostream>

using namespace std;

int main() {
	int v = 10;
    
    //๋ฐฉ๋ฒ•1
    int* p_x = &v;
    //๋ฐฉ๋ฒ•2
    int * p_y = &v;
    //๋ฐฉ๋ฒ•3
    int *p_z = &v;
    // ์—ฌ๋Ÿฌ ํฌ์ธํŠธ ์„ ์–ธ ์‹œ,
    int *p1, *p2, *p3, p4
    //์ด๋•Œ, p4๋Š” ๊ธฐ๋ณธ intํ˜• ๋ณ€์ˆ˜๊ฐ€ ๋œ๋‹ค.
    
    return 0;
}

์„ ์–ธ ์‹œ, ์‚ฌ์šฉํ•˜๋Š” ( * ) ์€ ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์ž„์„ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์ด๊ณ ,

์•„๋ž˜ ๋‚ด์šฉ์— ์—ญ์ฐธ์กฐ์— ์“ฐ์ด๋Š” ( * )์€ ์ฃผ์†Œ์— ๋‹ด๊ธด ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์—ญํ• ์ด๋‹ค.

 

์ผ๋ฐ˜ ๋ณ€์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋Š” ์„ ์–ธ ์‹œ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์œผ๋ฉด ์“ฐ๋ ˆ๊ธฐ๊ฐ’์ด ์กด์žฌํ•œ๋‹ค.

 

 

๐Ÿข ์ฃผ์†Œ์—ฐ์‚ฐ์ž (&) - address of operator

์ฃผ์†Œ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ€์ˆ˜์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

#include <iostream>

using namespace std;

int main()
{
	int a = 123;

	cout << &a << endl;
    
    return 0;
}

 

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ํŒŒ์ผ์„ ๋””๋ฒ„๊น…ํ•˜๋ฉด ๋ฌด์ž‘์œ„ํ•œ 16์ง„์ˆ˜์˜ ์ฃผ์†Œ๊ฐ’์ด ์ƒ์„ฑ๋œ๋‹ค.

 

# x86 ํ™˜๊ฒฝ
00EFFB00

# x64 ํ™˜๊ฒฝ
0000001A756FF854

Press any key to close this window . . .

 

ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๋•Œ, ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— 123์ด๋ผ๋Š” ๊ฐ’์ด ์กด์žฌํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ด‘ํ™”๋ฌธ์— ์™•์ด ์‚ฐ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

์ด๋•Œ, 

•  ๊ด‘ํ™”๋ฌธ์€ ๋ณ€์ˆ˜๋ช…,

•  ์™•์€ ๊ฐ’,

•  ๋„๋กœ๋ช…or์šฐํŽธ๋ฒˆํ˜ธ(์„œ์šธ ์ข…๋กœ๊ตฌ ํšจ์ž๋กœ 12 ๊ตญ๋ฆฝ๊ณ ๊ถ๋ฐ•๋ฌผ๊ด€ or 03045)๋Š” ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.

 

์šฐ๋ฆฌ๋Š” ๋ณ€์ˆ˜๋ช…๋งŒ์œผ๋กœ ๊ด‘ํ™”๋ฌธ์„ ์‰ฝ๊ฒŒ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ์œ„์น˜๋Š” ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค.

๋”ฐ๋ผ์„œ ๋„๋กœ๋ช…์„ ํ†ตํ•ด์„œ ์ฐพ์•„๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š”๋ฐ

 

์ปดํ“จํ„ฐ ๋˜ํ•œ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค.

์ด๋ ‡๊ฒŒ๋˜๋ฉด ์ปดํ“จํ„ฐ๋Š”  ๋” ๋น ๋ฅธ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์–ด๋–ป๊ฒŒ๋ณด๋ฉด ๋ณ€์ˆ˜๋ช…์€ ์›น์‚ฌ์ดํŠธ์— IP๊ฐ’์„ ๋„๋ฉ”์ธ์œผ๋กœ ํ•œ ๋ฒˆ ๋ฎ๋“ฏ์ด ์ฃผ์†Œ๊ฐ’์„ ์šฐ๋ฆฌ๊ฐ€ ์“ฐ๊ธฐ ํŽธํ•˜๊ฒŒ ์ด๋ฆ„์„ ์ง€์–ด์ฃผ๋Š”๊ฑฐ๋ผ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 

 

๐Ÿซต๐Ÿป ์—ญ์ฐธ์กฐ ์—ฐ์‚ฐ์ž (*) - de-reference operator

์—ญ์ฐธ์กฐ ์—ฐ์‚ฐ์ž(*)๋ฅผ ํ†ตํ•ด ํŠน์ • ์ฃผ์†Œ ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

#include <iostream>

using namespace std;

int main()
{
	int a = 123;
	int *address_a = &a;
    
	cout << *address_a << endl;
    
    return 0;
}

 

๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋ฉด

123

Press any key to close this window . . .

 

a๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๊ฐ’์— ์กด์žฌํ•˜๋Š” ๊ฐ’์ด ์ถœ๋ ฅ๋œ๋‹ค.

 


๐Ÿงฑ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ

์šฐ๋ฆฌ๋Š” a ๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑ ํ›„, ๊ฐ’์„ ์ดˆ๊ธฐํ™” ํ•œ ํ›„, ํ•จ์ˆ˜์—์„œ ํ•ด๋‹น ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์ฃผ๋ ค๋ฉด return์„ ํ†ตํ•ด์„œ ๊ฐ’์„ ๋ฐ›์•„์™€์•ผํ•œ๋‹ค.

 

๊ทธ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

#include <iostream>

using namespace std;

void printFunc(int a) {
    cout << "-------------Func Address-------------" << endl;
    cout << &a << endl;
}

int main()
{
    int a = 12;

    cout << "-------------Main Address-------------" << endl;
    cout << &a << endl;
    
    printFunc(a);
    
    return 0;
}

mainํ•จ์ˆ˜์—์„œ์˜ a์˜ ์ฃผ์†Œ๊ฐ’๊ณผ printFuncํ•จ์ˆ˜์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ ๊ฐ’์„ ์ฐ์–ด๋ณด๋ฉด ๊ฐ™์€ ๊ฐ’์„ ๋‹ค๋ฃจ์ง€๋งŒ ์ „ํ˜€ ๋‹ค๋ฅธ ์ฃผ์†Œ๊ฐ’์ด ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

-------------Main Address-------------
00BCFC28
-------------Func Address-------------
00BCFB54

Press any key to close this window . . .

 

์ด๋ฅผ ํ†ตํ•ด, ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ™์€ ๊ฐ’์ด์ง€๋งŒ ์ƒˆ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹นํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

ํ•˜์ง€๋งŒ, ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํ•ด๋‹น ๊ฐ’์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์šฐ์„  ์ฃผ์†Œ๊ฐ’์ด ์ž˜ ์ „๋‹ฌ๋˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.

#include <iostream>

using namespace std;

void printAddressFunc(int *px) {
    cout << "-------------Func Address-------------" << endl;
    cout << px << endl;
}
int main()
{
    int x = 5;
    int *px = &x;
    cout << "-------------Main Address-------------" << endl;
    cout << px << endl; 

    printAddressFunc(pa);
    
    return 0;
}

ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑ ํ›„, ํ•ด๋‹น ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ฅผ  ์—ญ์ฐธ์กฐํ•˜์ง€ ์•Š๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ๋ณด์ž.

 

-------------Main Address-------------
00BCF904
-------------Func Address-------------
00BCF904

Press any key to close this window . . .

๊ฐ™์€ ๊ฐ’์˜ ์ฃผ์†Œ๊ฐ€ ์ „๋‹ฌ๋˜๊ณ  ์žˆ๋‹ค.

 

์ด์ œ ํ•ด๋‹น ์ฃผ์†Œ๋กœ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•˜์—ฌ return ์—†์ด ๊ฐ’์„ ๋ฐ”๊ฟ”๋ณด์ž.

 

#include <iostream>

using namespace std;

void changeFunc(int *p) {
	*p = 3;
	cout << *p << endl;
}

int main()
{
	int x = 5;
	int *px = &x;
    
    // ๋ณ€๊ฒฝ ์ „ ์ถœ๋ ฅ
	cout << *px << endl;

	// ๋ณ€๊ฒฝ
	changeFunc(px);
    
	// ๋ณ€๊ฒฝ ํ›„ ์ถœ๋ ฅ
	cout << *px << endl;
    
    return 0;
}

 

ํ•ด๋‹น ๊ฐ’์„ ์—ญ์ฐธ์กฐ ์—ฐ์‚ฌ์ž๋ฅผ ํ†ตํ•ด 3์œผ๋กœ ๋ณ€๊ฒฝํ•ด๋ณด๊ฒ ๋‹ค.

 

5
3
3

Press any key to close this window . . .

 

๋ณ€๊ฒฝ ์ „์— 5๊ฐ€ ํ•จ์ˆ˜์—์„œ 3์œผ๋กœ ๋ณ€๊ฒฝ๋˜๊ณ , return์„ ํ•˜์ง€ ์•Š์•˜์Œ์—๋„ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์„ ๋‹ค์‹œ ์ถœ๋ ฅํ•˜๋ฉด 3์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.