CPP_어소_28_포인터 배열

CJB_ny·2022년 6월 6일
0

CPP_AROTHO

목록 보기
26/83
post-thumbnail

*(arr + 0) == arr[0]


변수 선언할 때

int i = 10; 이런식으로 했는데

"포인터"는 "주소"를 저장하는 변수이다.

그런데 그냥 주소를 저장하는게 아니다.

int* pInt = nullptr; 에서 int* 가 하는 역할은 뭘까?

주소를 가르키는데 그 주소에 있는 데이터를 int형으로 읽겠다 라는말? 아니가!

포인터 변수 입장에서는 실제 그 데이터가 중요한게 아니다.


포인터 변수의 크기?

애내들이 다 각각 int = 4byte, char = 1byte, short* = 2byte가 아니라

"근본"은 주소를 저장하는 변수이다.

주소를 저장한다는 부분에서는 용도가 모두 같다.

주소를 저장하는 변수의 크기는 다 같다. 즉, 포인터 변수의 크기는 다 같다.

그러면 포인터 변수의 크기는?

Window 운영체제의 플랫폼이 두가지 가있는데

  • x86 = 32bit (고착화 되어 32bit를 x86이라함)

  • x64 = 64bit

이 플랫폼에 따라서 포인터 변수의 크기가 변경된다. == 가변 길이 이다.

따라서 Window운영체제의 bit수가 의미하는 바를 알 필요가 있다.

Window운영체제의 비트의 의미

그래서 몇비트 이게 뭐냐? 하면

한번에 어떤 명령을 처리를하는 기본 단위이다.

운동선수를 예로 들면

몸 = 하드웨어, 머리 = software인데

몸은 8비트 처리가 가능한데 소프트웨어가 4바이트 명령 보는건 ok

그런데 몸이 썩어서 4바이트 밖에 안되는데 소프트웨어가 8바이트 명령은 안됨.

우리는 지금 64비트가 당연해서 포인터 변수도 크기도 8바이트이다.


주소를 가지는 "최소 단위"는 1byte이다.

그런데 4byte는 표현할 수 있는 가짓수가 2^32이다.

그래서 4byte 변수로 표현할 수 있는 "주소"는 0 ~ (2^32-1)이다.

4바이트 변수로 한번에 만들어낼 수 있는 주소 번지 숫자의 MAX값이.

주소의 단위 크기는 1byte인데 OS는 64비트일경우 한번에 처리하는 양이 8GB라서...

이부분이 이해가 안감.


32비트 운영체제에서는 RAM을 4G이상 꼽아 넣어도 의미가 없다.

(그러면 64비트 운영체제에서는 램을 8기가 이상 꼽아도 의미가 없나..??)

따라서 누가 물어보면 "아~ OS의 운영체제 bit수에 따라 다릅니다!" 라고 ㅇㅋ?

8 나옴. sizeof(int*)

i의 주소 번지를 pInt에 저장을 함.

i의 시작이 100이고 끝부분은?

주소는 1바이트 단위이고, int형은 4바이트 이기때문에 104아니야?

(101로 생각 했었다 => 좆잡고 반성해라)

만약 pInt += 1을 하면

어떻게 될까?

이렇게 됨

주소값이 1바이트 단위라 4가 늘어남.

만약 pInt의 주소값이 100이라고하면 여기 1을 더하면 101아니야??

=> 일반적인 정수의 덧셈을 한다면 101이 되는것이 맞음.

그런데 표현방식이 "정수"이기는 한데 실제로는 104가 들어간다.

즉, pointer의 연산은 정수의 연산을 따르지 않는다.

포인터 변수의 연산은 어떤 의미인지 알아보아야한다.

포인터 변수의 연산

i라는 주소를 int로 보고있는데

pInt += 1은 곧이 곧대로 100번지에서 101번지로 가라! 라는 말이 아니라

정수 자료형의 주소의 다음 정수 자료형의 주소로 가라! 라는 의미이다.

만약 그 뒤에 104번지 int가 또 있다면 104번지로 가라! 라는 말임.

그러면 char* 에 += 1을 하면 주소값은 1이 증가를 한다.(char가 1바이트라)

short 포인터 경우는? => 2바이트 증가 (short가 2바이트라)

증감 단위가 자료형에 따라 다르다.

포인터와 배열

배열의 특징?

  1. 메모리가 연속적인 구조이다.
  2. 배열의 이름은 배열의 시작주소이다.

연속적이네!

배열의 이름이 시작 주소 맞네!

(근데 왜???)

우리가 포인터 배웠으니까 우리가 원하는 특정 주소에 포인터로 접근이 가능하지 않을까??

크기는 4바이트 단위이다. => 위에서 설명함!

시작주소는 iArr이다.

그리고 두번째 칸에 10을 넣고싶다.

그러면 두번째 주소로 가려면 iArr += 1하면 되지 않을까?

ㅇㅇ 맞음.

포인터 변수 앞에 * 붙이면?

*(arr + 1)

지금 나의 주소를 참조해라

주소값으로 접근하라!

그런데 그 "접근"하는 개념 자체가 포인터 변수가 뭐냐(자료형이 뭐냐)에 따라 달라진다.

본인이 알고 있는 그 주소에 4byte 정수 단위로 접근을 하겠다! 라는 말이다(int* 일 경우)

4바이트 단위로 값에 "접근"을 해서 그곳에 값을 10을 넣겠다.

ㅇㅇ.

그러면 첫번째 칸에 값에 접근을 하려면 어떻게 해야 할까?

이렇게 하면 됨.

그래서 배열의 첫번째 인덱스가 0이다!!!!!!!!

이거 때문에 배열의 첫번째 인덱스가 0이다.

축약한 연산자가

바로 arr[ 0 ], arr[ 1 ]이것이다.

지금 이 ' [ ' 꺽쇠 연산자가 의미하는게 ' *(Arr + 0) ' 이것을 의미한다.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글