728x90
- 포인터 변수
- 포인터 변수란 주소를 저장하는 변수로써 <자료형 + * + 변수명> 형태로 작성된다.
포인터 변수에서 자료형은 해당 포인터에게 전달된 주소를 해석하는 단위로써 사용된다.
int i = 100;
int* pInt = &i;
위의 포인터 변수는 변수 i의 주소를 저장하며 int형이므로 4바이트 단위로 주소를 해석하게 된다. - 포인터의 해석
주소는 정수 표현이기 때문에 bit단위로 표현될 수 없어 Byte 단위로만 해석된다.
포인터 변수는 "이미 답이 정해진 변수"이다.
포인터 변수를 int*로 선언하였으면 해당 주소의 데이터는 int형이어야만 한다. - 만약 자료형이 float인 경우도 4byte 단위이고, int인 경우도 4byte 단위로 같은 경우, float을 int형 포인터 배열(int*)에 저장하게 된다면 어떤 문제점이 발생할까?
- 포인터 변수란 주소를 저장하는 변수로써 <자료형 + * + 변수명> 형태로 작성된다.
float f = 3.f;
int* pInt = (int*)&f; // int*로 형변환 해주지 않으면 에러 발생
int i = *pInt;
-
- float f 변수에 실수 3.f을 저장한 뒤 int형 포인터가 주소 값의 데이터를 해석하도록 하였다.
이후 int형 변수 i를 출력해보면 결과는 '3'이 아닌, '1077936128..'이 출력된다.
변수 f 에는 실수 표현방식(부동소수점)의 3이 들어있다.
(float형의 부동소수점은 32bit로 이루어져있어 00.0000000~ 형태로 저장된다.)
그러나 포인터 변수 pInt는 int형이기 때문에 int관점에서 부동소수점을 해석하여 모든 비트를 정수로 해석하게 되고, 그로인해 i의 결괏값이 매우 큰 수로 출력된다. - 포인터의 크기
포인터의 크기는 프로그래머가 목적으로 하는 운영체제에 따라 변화한다.
사용하려는 운영체제가 32bit 기반이라면 포인터의 크기는 4byte이고, 운영체제가 64bit라면 8byte이다. - 포인터의 주소 저장
int i = 0;
int* pInt = &i;
pInt의 주소가 100이라면 i는 int형이므로 4byte 단위로 주소가 해석된다.
따라서 int i의 변수 값은 101, 102, 103, 104번지에 저장된다.
만약 "pInt+1"을 수행한다면 101번지가 아닌 104번지가 된다.
정리하자면, pInt는 int* 변수이기 때문에 가리키는 곳을 int로 해석한다. 따라서 주소 값을 1 증가하는 의미는 다음 int 위치로 접근하기 위해 sizeof(int) 단위로 증가한다고 해석된다.
- float f 변수에 실수 3.f을 저장한 뒤 int형 포인터가 주소 값의 데이터를 해석하도록 하였다.
- 포인터와 배열
- 배열의 특징
1. 메모리가 연속적인 구조이다.
2. 배열의 이름은 배열의 시작 주소이다.
- 배열의 특징
int iArr[10] = {};
// int 단위로 접근
*(iArr + 0) = 10; // iArr[0] = 10;
*(iArr + 1) = 10; // iArr[1] = 10;
-
- 포인터 배열의 + 0, 1 은 배열의 인덱스를 움직이는 것과 같다.
728x90
'📚책읽기' 카테고리의 다른 글
[C/C++] const 포인터, void 포인터 (0) | 2022.03.09 |
---|---|
[C/C++] 포인터 이해 확인 문제 (0) | 2022.03.07 |
[C/C++] 메모리 영역, 변수-2 (정적변수/외부변수), 분할구현 (0) | 2022.03.02 |
[C/C++] 함수, 재귀함수, 배열 (0) | 2022.02.17 |
[C/C++] 변수(지역변수/전역변수), Visual Studio 단축키(주석, 디버그) (0) | 2022.02.17 |