2020년 7월 1일 수요일

주소열과 배열의 관계

동적할당을 하는 경우 메모리 주소를 가져와 접근한다. 이 주소는 가상메모리 주소로 프로세스마다 독립적으로 배당받는 상대적 주소이다. 같은 주소값이라도 다른 프로세스라면 공유가 되지 않는다.

자료형의 크기만큼 연속해서 할당되며,

이러한 메모리 주소를 포인터가 갖고 *를 붙이면 그 주소의 값을 가져온다.

그런데 포인터에서 덧셈을 할 경우 자료형의 크기만큼 더해진다.

그러므로 a + 1 을 읽는 것과 a[1] 은 같다.

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

#include "pch.h"

#include <iostream>

#include <windows.h>

#include <tchar.h>

typedef struct {

int a;

int b;

int c;

} Tmp;

template <typename T>

void Search(int num)

{

T* tmp = (T*)malloc(sizeof(T) * 10);

std::cout << "size of struct is " << sizeof(T) << std::endl;

for (int j = 0; j < 2; j++) {

(tmp + j)->a = j;

(tmp + j)->b = j;

(tmp + j)->c = j;

}

for (int j = 0; j < 2; j++)

{

std::cout << j << " address calculate " << (tmp + j)<< (tmp + j)<< std::endl;

std::cout << j << " access by address " << (tmp + j)->a << (tmp + j)->b << std::endl;

}

std::cout << std::endl;

for (int j = 0; j < 2; j++)

{

std::cout << " object address is " << (tmp + j) << std::endl;;

std::cout << " object member address is " << &((tmp + j)->a) << std::endl;;

std::cout << " object member address is " << &((tmp + j)->b) << std::endl;;

std::cout << " object member address is " << &((tmp + j)->c) << std::endl;;

}

}

int main()

{

int i = 0;

TCHAR* str = (TCHAR*)malloc(sizeof(TCHAR)*128);

wsprintf(str, TEXT("for test"));

std::cout << "size of TCHAR is " << sizeof(TCHAR) << std::endl;

for (; i < 4; i++)

{

std::wcout << str + i << std::endl;

std::cout << str + i << std::endl;

}

std::cout << std::endl;

Search<Tmp>(3);

}

댓글 없음:

댓글 쓰기

List