우리가 알고 있는 변수 선언 시 메모리 구조
메모리는 주소를 통해 메모리에 접근하여 값을 읽고 쓸 수 있다.
문자형 1byte, 정수형 4byte, 실수형 8byte
포인터의 개념
포인터의 의미는 어느 특정 주소를 가리키거나 향하게 하고 있다는 뜻이다.
주소 값을 가리킨다는 의미는 그 주소값을 가지고 있다는 의미이다.
포인터란 메모리의 주소값을 가리키는 변수이다.
포인터 선언 및 사용방법
포인터 선언하기
char *pA;
int *pB;
doule *pC;
포인터 변수 선언 시에는 변수명 앞에 * 기호를 붙여주면 된다.
*표가 붙은 것은 주소 값만 저장하는 변수이다.
int b = 100;
int *pB = &b;
b = 100
&b = 0x200(주소값)
*pb = 100
pB = 0x200
포인터 변수 pB가 변수 b를 가리킨다라고 한다.
포인터 변수에 바로 값을 대입X
& (주소연산자) 주소값을 나타냄
"b의 주소값을 *pB(주소값만 저장하는 변수)
에 대입한다."
변수 pB는 주소값 0x01을 저장하고 있는 포인터 변수
이 주소값에 해당하는 메모리를 가진 변수는 int b
pB는 변수 b의 주소 및 실제 값을 참조 가능
#include<stdio.h>
int main(void) {
char str[] = "Programming";
char *ptr1;
ptr1 = &str[0]; // 주소값 대입
printf("%p\n", ptr1);
printf("%p\n", ptr1 + 1);
printf("%c\n", *(ptr1 + 1)); // 주소값의 실제값
printf("%p\n", ptr1 + 3);
printf("%c\n", *(ptr1 + 3));
}
출력결과
000000EDC7DDF678
000000EDC7DDF679
r
000000EDC7DDF67B
g
+1 : 단위요소를 나타냄
char + 1 : 다음요소 (1byte)
int + 1 : 다음요소 (4byte)
int + 3 이라면 12byte만큼 뒤의 요소 (3번째 요소)를 나타낸다.
처음 선언 될 때는 *이 주소값을 나타내지만 이후에 나오는 *은 실제값을 나타낸다. (*의 의미가 다르다)
int main(void) {
char a = 'F';
int b = 5;
char *pA = &a;
int *pB = &b;
printf("%c\n", *pA);
printf("%d\n", *pB );
}
출력결과
F
5
*pA는 a의 주소값을 저장하게 된다.
그래서 pA를 출력하면 주소값이 나오고, *pA를 출력했을 때는 주소값의 실제값을 출력한다는 의미이다.