C++프로그래밍/C 와 C++ 기초실습

포인터 연산

season97 2024. 9. 17. 20:55

※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로

C++에 대한 구체적인 정보를 담고 있지 않습니다.

 

▶ 포인터 연산

 

1. 주소 연산자 ( & )

int main()
{
	// 주소 연산자
	int num = 1;
	int* pointer = #
}

 

ㆍ 해당 변수의 주소를 알려주세요
ㆍ 더 정확히 말하면 해당 변수타입에 따라서 Type*을 반환


2. 산술 연산자 ( + -  )

	pointer = pointer + 1;
	pointer++;
	++pointer;
	pointer += 1;

ㆍ 다 된다.

ㆍ 근데 무슨기능을 할까??

일반 변수 num의 +=1 산술 연산

ㆍ 간단하다. 그냥 1이 증가했다

포인터 연산

ㆍ pointer += 1 을 찍어볼거다

연산 결과

ㆍ 4만큼 증가했다!!!

int main()
{
	// 산술 연산자
	num += 1;		//1증가
	pointer += 1;   //4증가
}

ㆍ int* : 포인터 타입이네. (4바이트(32빗) 8바이트(64빗)) 주소를 담는 바구니
ㆍ int : 주소를 따라가면 int(4바이트 정수형 바구니)가 있다고 가정해라 라는뜻
ㆍ 포인터 변수에서 +나 -등 산술 연산으로 1을 더하거나 빼면, 정말로 "그 숫자"를 더하고 뺴라는 의미가 아니다.
ㆍ 한번에 Type의 크기만큼 이동해라 라는 뜻이다.

ㆍ 이 기준은 포인터의 자료형 기준이다 

ㆍ int는 4Byte 자료형 이므로 4가 증가한 것이다.
ㆍ 만약 2를 더했으면 8이 증가했을 것이다.
ㆍ 만약 char이였다면 1이 증가했을 것이고 short였다면 2가 증가했을 것이다.

어셈블리 확인

ㆍ 어셈블리에서도 +=1이 add 4로 간단하게 들어가고 있는 모습이다.

더보기

요약

ㆍ 포인터에서 산술 연산을 하면 해당 자료형의 크기만큼 곱해서 연산된다고 생각하자

 

※ 배열과 사용할 때 굉장히 중요한 개념이니 알아두자


 

3. 간접 연산자 ( * )

 

ㆍ 포탈을 타고 해당 주소료 슝~ 이동

	num = 3;
	*pointer = 3;

ㆍ 두 코드는 같은말이다.

ㆍ 처음 선언할 때 말고 그냥 사용할때 앞에 찍어주면 해당 위치로 이동하라는 의미다.


4. 간접 맴버 연산자 ( -> )

	Player player;
	player.hp = 100;
	player.damage = 5;
	player.def = 5;

	Player* playerPtr = &player;
	(*playerPtr).hp = 200;
	(*playerPtr).damage = 20;
	(*playerPtr).def = 25;
	playerPtr->damage = 28;

ㆍ (*playerPtr). 이랑 player-> 같은 의미다! (어셈블리까보면 걍 똑같다!)

 

ㆍ 그리고 구조체도 주소 찍어보면 메모리에서 4바이트 간격으로 hp damage def 들어가있다

 

더보기

ㆍ *간접 연산자 (포탈 타고 해당주소로 gogo)
ㆍ 구조체의 특정 맴버를 다룰 때 사용 (어셈블리 까보면 걍 덧셈)
ㆍ ->는 *와 .를 한방에 처리하는거로 이해하자

                                      ↓

어셈블리 까보면 두단계로 걸치든 한번에 -> 하든똑같다