※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로
C++에 대한 구체적인 정보를 담고 있지 않습니다.
▶ 포인터 연산
1. 주소 연산자 ( & )
int main()
{
// 주소 연산자
int num = 1;
int* pointer = #
}
ㆍ 해당 변수의 주소를 알려주세요
ㆍ 더 정확히 말하면 해당 변수타입에 따라서 Type*을 반환
2. 산술 연산자 ( + - )
pointer = pointer + 1;
pointer++;
++pointer;
pointer += 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)
ㆍ 구조체의 특정 맴버를 다룰 때 사용 (어셈블리 까보면 걍 덧셈)
ㆍ ->는 *와 .를 한방에 처리하는거로 이해하자
↓
어셈블리 까보면 두단계로 걸치든 한번에 -> 하든똑같다
'C++프로그래밍 > C 와 C++ 기초실습' 카테고리의 다른 글
참조타입 (0) | 2024.09.18 |
---|---|
포인터 실습 해보기 (일반return과 포인터를 이용한 원본객체 조정) (0) | 2024.09.17 |
포인터 (0) | 2024.09.17 |
스택 프레임과 호출스택 (디버그) (2) | 2024.09.16 |
const와 메모리 구조 (3) | 2024.09.16 |