#include <stdio.h>
int main(void)
{
int a[] = {2, 3, 5, -7};
int *p, *q; // int 타입의 값을 저장하는 메모리 주소를 가리키는 포인터
for (int i=0; i<4; i++)
printf("*(a+%d) = %d\n", i, *(a+i));
/*
* 배열의 이름 자체는 해당 배열의 첫 번째 요소를 가리키는 포인터
* a+i는 배열의 첫 번째 요소에서 i만큼 떨어진 요소의 주소를 나타냄
* 따라서 *(a+i)는 역참조이므로 배열의 i번째 요소의 값
*/
p=a;
q=p+1;
printf(" q-p = %ld\n", q-p); // 포인터 간 거리 측정
printf("(long) q- (long) p = %ld\n", (long) q - (long) p);
/* 포인터 간 거리와 크기는 다르다! 크기는 자료형의 크기에 따라 달라짐
* int형 포인터는 주소가 하나씩 이동할 때마다 int 타입의 크기인 4byte씩만큼 달라짐
* long 타입이면 long 타입만큼씩 커짐
return 0;
}
여기서, ptr 값에서 n씩 늘리면 메모리는 n씩 늘어나지만 실제 크기는 4*n씩 증가한다.
이는 ptr의 자료형인 int가 4 byte씩이기 때문이다.
참고
'Programming Language > C' 카테고리의 다른 글
[C] 특정 규칙에 따라 문자열을 숫자로 변환하기 (0) | 2024.03.18 |
---|---|
[C] 구조체 struct (0) | 2024.03.13 |
[C] 포인터 선언과 역참조 (0) | 2024.03.11 |
[C] C언어의 스토리지 클래스(기억 영역, Storage Class) (0) | 2024.03.07 |
[C] 실수 자료형 float, double 소수점 출력 범위 지정 (1) | 2024.03.06 |