포인터(pointer)란 메모리의 주소값을 저장하는 변수이며, 포인터 변수라고 부른다.
말 그대로 뭔가를 가리키는 의미를 가지고 있다. (주소값을 가리킴)
chart형 변수가 문자를 저장하고, int형 변수가 정수를 저장하는 것처럼 포인터는 주소값을 저장한다.
int *p = NULL;
int *a;
*a = 10;
printf("%d", a);
printf("%d", *a);
int *a -> a라는 변수를 만들고 메모리와 상관 없이 변수 a를 만들어놓고 주소값을 가지는 특징이 있다. 보통 변수는 아니고 포인터 변수다.
*a = 10 -> *a는 a의 값이라고 해석하고, a에 값에 해당하는 메모리 주소의 메모리 '주소의 값'에 10을 할당해라
printf("%d", a); = 102 -> 변수 a에 할당된 값(메모리 주소) (102는 임의로 만든 주소입니다.)
printf("%d", *a); = 10 -> a의 값 즉, 102에 할당된 메모리 주소의 값 10
포인터 변수의 크기는 주소를 가리키기 때문에 항상 4byte의 동일한 크기를 가진다.
1) 주소 연산자(&)
주소 연산자는 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환한다.
2) 참조 연산자(*)
참조 연산자는 포인터의 이름이나 주소 앞에 사용하여, 포인터에 가리키는 주소에 저장된 값을 반환한다.
dereference라고 하여 역참조연산자라고 한다.
포인터는 하나만 알면된다.
*p는 선언할 때를 제외하고 무조건 값을 가리킨다고 생각하면 되고 &는 주소를 가리킨다고 생각하면 된다.
1차원 배열에서 배열명은 주소값을 나타낸다.
int a[2] = {1,2};
int *p;
p = a;와 같이 사용할 수 있다.
또한 배열의 값에 접근하기 위해서 a[0]과 같이 사용하고 이 값의 주소값을 구하기 위해 '&'를 붙여준다. 즉 p = &a[0]; 와 같이 사용할 수 있다는 것이다.
문제)
단, 아래의 scanf()함수의 입력으로 90을 타이핑했다고 가정
int main(){
int i = 10;
int j = 20;
int *k = &i;
scanf("%d", k);
printf("%d, %d, %d₩n", i, j, *k);
}
답) 90, 20, 90
해설 ) scanf에 90입력으로 k는 i의 주소를 참조하고 있기에 90을 입력하면 i의 값이 10에서 90으로 바뀐다.
그래서 i는 90, j는 20, *k의 값 또한 i의 주소값을 참조하고 있기에 i의 90이랑 같다
문제) 배열과 포인터
#include<stdio.h>
int main(void){
int i;
int a[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
int *ptr = a + 3;
for(i = 0; i < 5; i++){
printf("%d", *(ptr+i)-3);
}
}
답 : 37 47 57 67 77
! 배열과 포인터의 관계
int a[5];
int *b = a;
a[2] = 10;
b[2] = 20;
10에서 20으로 값이 바뀐다.
문제)
int a[] = {1,2,4,8};
int *p = a;
p[1] = 3;
a[1] = 4;
p[2] = 5;
printf("%d%d₩a", a[1] + p[1], a[2] + p[2]);
답 : 8 10
응용)
int a[] = {1,2,4,8};
int *p = a+1
p[1] = 3;
a[1] = 4;
p[2] = 5;
printf("%d%d₩a", a[1] + p[1], a[2] + p[2]);
답 : 7 8
해설) P에 주소 시작이 다르니 헷갈릴수 있다는 점이 있다.
문제)
#include<stdio.h>
int main(void){
int a[4] = {10, 20, 30};
int *p = a;
p++;
*p++ = 100;
*++p = 200;
printf("a[0]=%d, a[1]=%d, a[2]=%d₩", a[0], a[1], a[2]);
}
답 : a[0] = 10, a[1] = 100, a[2] = 30
int num[4] = {1,2,3,4};
int *pt = num;
pt++;
*pt++ = 5;
*pt++ = 10;
pt--;
*pt+++ = 20;
printf("%d %d %d %d", num[0], num[1], num[2], num[3]);
답 : 1 5 30 4
주의)
*pt+++ = 20;
1) *pt += 20;
2) *pt++;