본문 바로가기
공부/C, C++

[C] 포인터 Pointer

by 김샤랑 2022. 1. 3.

[C] 포인터 Pointer


- 포인터란?

포인터는 두 수를 가리키는 기능을 뜻한다.


- 포인터 변수

포인터 변수란 주소를 저장하는 변수를 뜻한다. 

자료형* + 변수명 을 통해 포인터 변수를 선언한다.

자료형은 해당 포인터에게 전달된 주소를 해석하는 단위

int* i = 100;   // i는 주소를 저장하는 변수이다. 

 

위 포인트 변수는 주소로 접근했을 때 그곳의 실제 메모리 공간을 int로 보겠다.

 

1. 포인터 변수에 주소를 줬다. 

2. 그 주소가 가리키는 곳에 실제적으로 어떤 용도로 쓰이는지는 포인터 변수에게는 중요하지 않음(선언 시점에서 이미 자료형이(용도) 정해져 있음)

 

int 변수의 주소는 int 포인터가 받아가는 게 맞고

short 변수의 주소는 short 포인터가 받아가는 게 일반적으로 맞다.

 

두 개가 자료형이 다르면 강제 캐스팅으로 넣어 줄 수 있다.


-

(똑같은 내용 반복)

구문에 저 별(*)은 무엇일까?

int* pInt=&i;  //pInt에는 i 값의 주소 값을 저장

 

-> int에 별이 붙어 int 포인터 변수가 되었다 -> int형 변수들의 주소를 가리키는 변수.

 

* 앞에 자료형을 적어 자기가 가리킬 데이터 타입을 정해둔다.

포인터형 변수는 그 안에 데이터를 처리할 때 정수형일까 실수형일까. -> 정수형 표현 방식

 

포인터 변수 앞에 별 붙이면(*pInt) 주소값으로 접근

 

(번외. void* 포인터

void* pVoid nullPtr;

특정 데이터 타입으로 해석하지 않기 때문에 아무 데이터 타입 주소를 다 받을 수 있고 역참조가 안된다. 자기가 가리키는 곳을 뭘로 해석할지가 정해 있지 않기 때문에 역참조를 못해...+ 주소 연산도 안된다. +1 했을 때 몇 바이트 증가할지도 정해져 있지 않아서.

1. 원본의 자료형을 정하지 않음

2. 어떠한 타입의 변수의 주소든 다 저장 가능

3. 역참조 불가능

4. 주소 연산 불가능)


-

해당변수의 주소 값을 가리킨다.

 

변수의 주소 값을 직접적으로 받아 올 수 있다.


-주소의 단위

주소의 단위는 byte이다. 주소 차 이수만큼 byte가 있다.

주소를 가질 수 있는 최소 단위가 byte이다. 

4byte가 표현할 수 있는 주소 번지의 max 수는 0~ 2^32 -1 정도


int i =100;
int* pInt=&some;  // pInt에 some의 주소 값이 들어 있다.

//주소로 접근하기
i = *pInt;            // *pInt는 some의 주소 값에 있는 것으로 i에 대입한다.

// pInt가 가리키는 some에 있는 값을 i 에 넣어라.

- 포인터 변수의 크기는 무엇일까?

그곳을 어떻게 해석하는 지만 차이가 있을 뿐 주소를 저장하는 변수이다. 그렇기 때문에 포인터 변수의 크기는 다 같다.

 

Q: 그럼 몇 byte?

-> 4byte? 8byte? 

-> 가변 길이다. 

-> 내가 목적으로 하는 운영체제에 따라서 32비트 운영체제 기반이면 4byte이고 64비트 운영체제 기반이면 8byte이다.

 

- 32비트 운영체제의 한계?

32비트 운영체제에서는 RAM을 4기가 바이트 이상 꼽아도 의미 없다는 말을 들어본 적이 있는가?

32비트 운영체제에서는 한번에 처리할 수 있는 단위가 4바이트이기 때문에 내가 명령을 만들어 줄 때 4바이트 명령이면 표현할 수 있는 주소 번지가 4GB까지 밖에 되지 않는다. 내가 꽂은 RAM이 16기가 이어도, 어차피 4GB를 넘어 주소 값을 만들 수 없다. 물리적으로 4GB 이상의 램을 꽂았지만 OS의 한계로 4GB 이상으로 접근이 안돼 메모리 공간이 활용이 안된다.

 

-64비트 운영체제

64비트 운영체제로 넘어오면 한동안은 절대 문제가 없다.  -> 우리는 64비트 플랫폼 기준의 프로그래밍을 할 것이기에, 8byte 단위의 처리 단위를 가진 OS를 목적으로 공부한다.

 

-sizeof함수로 알 수 있다.

int iSize = sizeof(int*);   // 8이 나온다. (64비트 운영체제라서)

 

int i=0;
pInt = &i;   

pInt += 1;

//pInt는 int* 변수이기 때문에, 가리키는 곳을 int로 해석한다
//따라서 주소값을 1 증가하는 의미는 다음 int 위치로 접근하기 위해서 sizeof(int) 단위로 증가하게 된다.
'+=1'을 1이 증가한다고 보지 않고 한 단계가 증가한다고 이해하면 편하다.

// 주소값을 1 상승시킴  -> 가리키는 곳을 int로 보고 있기 때문에 다음 int 위치로 가겠다. 주소를 4 증가.

 

 

주소의 증감단위자료형의 사이즈로 움직인다. 

 

 

 

'공부 > C, C++' 카테고리의 다른 글

[C] const 와 포인터  (0) 2022.01.04
[C] const, const 값 바꾸기  (0) 2022.01.04
[C] 구조체  (0) 2022.01.02
[C] 변수(지역 변수, 전역 변수, 정적 변수, 외부 변수)  (0) 2022.01.02
[C] 분할 구현  (0) 2022.01.02

댓글