주소 연산

Yama·2023년 12월 14일
0

어소트락 수업

목록 보기
13/55

주소 연산

  • 주소값의 표현 체계는 정수타입
  • 주소의 최소 단위는 바이트
    • 5,6번지 사이에는 1바이트의 크기가 존재한다.
  • 포인터 변수의 크기는 운영체제 플랫폼에 따라 최대 크기로 지정된다.
    • 64비트의 포인터 변수의 크기는 8바이트다.
    • 32비트 기준 포인터 변수의 크기는 4바이트, 4GB 이상의 메모리 주소를 가질 수 없는 문제가 있다.
      • 4GB이상을 꼽으면 무용지물이다.

배열의 포인터

  • 배열은 메모리가 연속적인 구조이다
  • 배열의 이름은 배열의 시작 주소값이다.
		int iArr[10] = {};

		int* pInt = iArr;
        
        *pInt = 100;
  • 포인터 역참조를 이용해서 100을 첫번쨰 칸에(인덱스0)에 대입함.
  • 2번쨰 칸에 넣고 싶다면 어케해야함?
		int iArr[10] = {};

		int* pInt = iArr;
        
        *(pInt + 4) = 100;
  • 시도 1
    • 주소의 최소 크기는 1 바이트니까 인트는 4바이트이므로 + 4 하면 4바이트 이동한다고 생각해서 + 4 함.
      • 틀림.
		int iArr[10] = {};

		int* pInt = iArr;
        
        *(pInt + 1) = 100;
  • 시도 2
    • 포인터에 적혀있는 자료형은 포인터 자료형 타입에 맞는 사이즈 단위로 띈다
		long long iArr[10] = {};
        
		long long* pInt = iArr;
        long long* pInt2 = iArr + 1;
		
        *pInt = 100;
        *(pInt + 1) = 400;
        *(pInt + 2) = 200;
  • long long 형은 바이트 크기가 8바이트 이기때문에 + 1 칸 해주면 주소값이 8바이트 커진다.
		int iArr[10] = {0, 1, 2, 3, 4 };

		int* pInt = iArr;
        
		*pInt = 1;
        
		pInt += 1;
  • 주소값이 4바이트 증가했다.(8 9, A, B, C)
		*(pInt + 0) = 1;
		*(pInt + 1) = 2;
		*(pInt + 2) = 3; // int 주소에 받아와서 8바이트 증가시킨 주소값에 3을 대입해라.
		*(pInt + 3) = 4;
	int iArr[0] = 1;
	int iArr[1] = 2;
	int iArr[2] = 3;
	int iArr[3] = 4;
  • 같은 의미.
  • 접근 하는 것뿐만 아니라 본인이 알고 있는 자료형으로 주소에 덧셈 뺼셈할떄 적혀있는 자료형의 바이트 값으로 생각한다.

void 포인터 추가

struct mystruct
{
	int a;
	short s;
};

int main()
{
	int num = 0;
	mystruct st = {};
    
    pVoid = &st;
	pVoid = #	

	pVoid + 1;
	*pVoid;
}
  • void 포인터는 가키리고 있는 주소값의 원형을 해석할 수 없기 때문에 접근 및 주소 이동이 불가능하다.

강의 코드

#include <iostream>

struct mystruct
{
	int a;
	short s;
};

int main()
{
	int num = 0;

	int* pNum = &num;

	*pNum = 100;
			
	float* pFloat = (float*)&num;
	int data = *pFloat;


	mystruct* pMySt = nullptr;

	mystruct st = {};

	pMySt = &st;

	(*pMySt).a;
	(*pMySt).s;

	pMySt->a;
	pMySt->s;


	void* pVoid = nullptr;

	pVoid = &st;
	pVoid = &num;	
    
	//pVoid + 1;
	//*pVoid;

	// 주소 연산
	{
		int iArr[10] = {};

		iArr[2] = 10;

		int* pInt = iArr;
		*(pInt + 0) = 1;
		*(pInt + 1) = 2;
		*(pInt + 2) = 3;
		*(pInt + 3) = 4; // pInt[3] = 4;

		pInt[0] = 1;
	}

	return 0;
}

1차 23.12.14
2차 23.12.15
3차 23.12.17
4차 23.12.18
5차 23.12.19
6차 23.12.25
7차 24.01.01
8차 24.01.23

0개의 댓글