정수형 포인터
만약 배열에서 다음 값을 읽기 위해 포인터 변수에 1을 더했을 때 번지가 1만큼만 이동한다면 문제가 발생할 것이다.
왜냐면 int는 4바이트를 차지하고 double이 8바이트인 것처럼 데이터 자료형이 모두 1바이트만 차지하는 것이 아닐뿐만아니라 자료형마다 크기가 모두 다르기 때문이다.
void main()
{
int ar[]={1,2,3,4,5};
int *pi;
pi=ar;
printf("첫 번째 요소 = %d\n",*pi);
pi++;
printf("두 번째 요소 = %d\n",*pi);
}
위 배열 ar은 1부터 5까지 정수를 담고 있다.
ar(배열명)은 그 자체로 배열의 첫번째 요소를 가리키는 포인터이기 때문에 pi = ar은 성립한다.
pi++는 pi가 가리키고 있는 번지수에 1만큼 더하는 것이 아닌 pi의 자료형의 크기만큼 더한다.
pi에 1을 더하면 pi의 자료형인 int의 크기, 4바이트만큼 더해 다음 배열의 요소를 가리키게 한다.
이런 포인터를 정수형 변수에 대한 포인터를 줄여 정수형 포인터라고 한다.
포인터 연산
① 포인터끼리 더할 수 없다.
② 포인터끼리 뺄 수 있으며 연산 결과는 정수이다.
③ 포인터와 정수의 가감 연산은 가능하며 연산 결과는 포인터이다.
포인터 연산을 할 때 포인터를 괄호로 감싸는 것과 감싸지 않는 것은 큰 차이가 있다.
*ptr++는 포인터 변수 ptr에 대하여 연산을 하는 것으로
ptr이 가리키는 번지의 값을 반환하고 ptr의 자료형의 크기만큼 더한다.
(*ptr)++는 ptr이 가리키는 번지의 값에 대하여 연산을 하는 것으로
ptr이 가리키는 번지의 값을 반환하고 ptr이 가리키는 번지의 값에 1만큼 더한다.
void형 포인터
void형 포인터는 대상체의 타입을 밝히지 않은 포인터로 어떤 자료형이든 될 수 있다. (대입을 통해서)
① void형 포인터를 정수형 포인터에 대입하려면 해당 포인터의 자료형대로 캐스팅해야한다.
② *연산자로 값을 읽을 때에도 정수형 포인터의 타입대로 캐스팅해야 한다.
③ 캐스팅 없이 증감연산자도 함부로 쓸 수 없다.
void형 포인터는 함수에서 포인터가 매개변수로 필요할 때 여러가지 타입의 포인터를 모두 받아들일 수 있게 사용한다.
'C++' 카테고리의 다른 글
| [C++] 이중 포인터 (0) | 2022.01.02 |
|---|---|
| [C++] malloc,calloc,realloc (0) | 2022.01.01 |
| [C++] 비트 연산자, 쉬프트 연산자 (0) | 2022.01.01 |
| [C++] cin,cout,endl 계산속도 올리기(시간 초과 해결) (0) | 2021.12.28 |
| [C++] 범위 기반 for문(range based for statement) (0) | 2021.12.25 |