본문 바로가기

Code/C++

[C++] & operator / pointer / pass by address/ function pointer

특정 소프트웨어들은 하드웨어와 연동하기 위해

구체적인 메모리 저장위치에 접근할 필요가 있다.

그렇기에 프로그래머들은

하위단계의 세부사항까지 접근할 수 있는 코드를 작성할 수 있어야한다.

 

 

&operator

주소값을 반환한다.

 

& x : x 의 주소값을 의미

 

Pointer variables

int *p : 정수형이 저장된 곳에 주소값을 저장하는 변수

 

 

 

예시 1)

 

변수

address

memory

x->

0x00(16진수)

10

px->

0x01

0x00

 

0x02

 

 

 

 

 

px->0x00 : 변수 px에 입력된 메모리값

&px->0x01 : 변수 px가 저장된 주소값

*px->*(0X00)->10 : 변수 px의 주소값을 파악, 이에 저장된 메모리값을 호출

 

 

예시 2)

변수

address

memory

x -> 

oxoo

4

p -> 

oxo1

oxoo

 

 

 

cout<<*p   

// 이는 p의 주소값으로 jump를 의미한다 따라서  *(oxoo)-> 4

4

 

 


 

// int& a=x / int& b=y

//&x : x의 주소값을 반환

//int* px : 포인터변수 선언(주소값을 저장하는 변수)

//*px : px에 저장된 주소값으로 jump in

 

int main() {

        int x = 10;

        int* px = &x;

        cout << x << '\t' << &x << endl;

        cout << *px <<'\t' << px << '\t' << &px << endl;

        return 0;

}

 

10      008FFE70
10      008FFE70        008FFE64

 


예시 3)

 

Pass by address

 

int * a= &x

int * b = &y

*b -> *(0x01)->2000

        

 

add

mem

x

0x00

10 = *a -> 2000

y

0x01

2000 = *b -> 10

a

0x02

0x00 -> gone

b

0x03

0x01 -> gone

temp

0x04

2000 -> gone

 

 

 

 

#include <iostream>

using namespace std;

//swap(int a,int b) : pass by value (단순히 값을 복사)

//swap(int &a, int &b) : pass by reference (x, a는 같은 메모리 공간을 사용)

//swap(int* a, int* b) : pass by address

void swap(int* a, int* b) {

        int temp = *b;

              *b = *a;

              *a = temp;

}

int main() {

        int x = 10, y = 2000;

        cout << x << '\t' << y << endl;

        swap(&x, &y);

        cout << x << '\t' << y << endl;

        return 0;

}

 

 

10      2000
2000    10

 

 


Function Pointer

 

예시 4)

 

 

address

memory

a

0x00

10

pa

0x01

0x00

ppa

0x02

0x01

 

0x03

 

 

int* ppa=&pa;

cout &ppa -<0x02

ppa -> 0x01

*ppa ->*0x01 -> 0x00

 

**ppa->**0x01 -> *0x00 -> 10

 

int main() {

        int a = 10;

        int* pa = &a;

        int** ppa = &pa;

        return 0;

 

 


예시 5)

 

 

add

mem

sum

0x00

a를 reg1저장

 

0x01

b를 reg2저장

 

0x02

reg1+reg2 ->reg3

 

0x03

reg3->reta->main

int sum(int a, int b) {

        return a + b;

}

int mult(int a, int b) {

        return a * b;

}

int evaluate(int (*func)(int, int), int a, int b) {

        return func(a, b);

}

int main() {

        int(*func)(int, int); // 입력2, 출력1인 함수의 주소값을 저장할 수 있는 포인터

        func = &sum;

        cout << func(10, 20) << endl;

        func = &mult;

        cout << func(10, 20) << endl;

        cout << evaluate(&sum, 10, 20) << endl;

        cout << evaluate(&mult, 10, 20) << endl;

        return 0;

}

 

 

30
200
30
200


 

 

해당 자료는 경희대학교 소프트웨어융합학과 배성호교수님 수업내용을 참조하였습니다.