참고)
% p : 포인터의 주소를 출력
포인터 변수는 읽기 전용의 메모리 주소를 저장한다. 그런데 그러한 메모리 주소를 조작할 수 있는데 그것이 바로 포인터 연산이다.
●포인터 연산 코드 예제
#include <stdio.h>
int main()
{
int num[3] = { 1, 2, 3 }; //int 4byte
int *numPtr1;
int *numPtr2;
int *numPtr3;
numPtr1 = num; // 배열 첫 번째 요소의 메모리 주소를 포인터에 저장
numPtr2 = numPtr1 + 1; // 포인터 연산
numPtr3 = numPtr1 + 2; // 포인터 연산
printf("numPtr1에 있는 주소값: %p\n", numPtr1); // 000000000062FDF0: 메모리 주소. 컴퓨터마다, 실행할 때마다 달라짐
printf("numPtr2에 있는 주소값: %p\n", numPtr2); // 000000000062FDF4: sizeof(int) * 1이므로 numPtr1주소에서 4증가
printf("numPtr3에 있는 주소값: %p\n", numPtr3); // 000000000062FDF8: sizeof(int) * 2이므로 numPtr1주소에서 8증가
return 0;
}
●논리적 그림
▲위의 논리적 그림이 맞다면 *numPt2로 000000000062 FDF4 주소를 역참 조하면 2가 나와야 한다.
●numPtr2 역참조 코드 예제
#include <stdio.h>
int main()
{
int num[3] = { 1, 2, 3 }; //int 4byte
int *numPtr1;
int *numPtr2;
int *numPtr3;
numPtr1 = num; // 배열 첫 번째 요소의 메모리 주소를 포인터에 저장
numPtr2 = numPtr1 + 1; // 포인터 연산
numPtr3 = numPtr1 + 2; // 포인터 연산
printf("numPtr2의 주소값: %p\n", numPtr2); // 000000000062FDF4: sizeof(int) * 1이므로 numPtr1주소에서 4증가
printf("numPtr2의 역참조값: %d\n", *numPtr2); // 2: 000000000062FDF4엔 2값이 들어가므
return 0;
}
추가 내용)
void 포인터는 자료형의 크기가 정해지지 않았기 때문에 + - 로 얼마나 이동해야 할지 모른다. 따라서 포인터 연산을 할 수 없다. void 포인터로 하고 싶다면, 다른 자료형의 포인터로 변환시킨 뒤 연산을 해야 한다.(그런데 굳이..?)
'프로그래밍 언어 > C' 카테고리의 다른 글
C언어 31강) 함수에 포인터 매개변수 활용하기 (함수 return 값 여러개 반환하는 방법) (0) | 2020.11.17 |
---|---|
C언어 참고내용- 선행처리기(preprocessor)란? (0) | 2020.11.17 |
C언어 29강) 자료형 변환하기 (0) | 2020.11.16 |
C언어 28강) 공용체 (0) | 2020.11.16 |
C언어 27강)++ &연산자로 구조체(struct)포인터에 구조체 변수 할당하기 (0) | 2020.11.16 |