int *p;
*p = 10; // 주소값이 쓰레기값으로 들어있음 -> 어디를 가리키고 있는 것인지 모름
포인터가 가리키는 변수의 자료형에 따라 ++(증가 연산) 한 결과가 다르게 나타난다.
포인터 자료형 | 증가되는 값 |
---|---|
char | 1 |
short | 2 |
int | 4 |
float | 4 |
double | 8 |
-> 자료형의 변수 크기와 같은 크기가 증가된다.
--(감소 연산) 결과도 마찬가지로 변수 크기만큼 변화한다.
*p++;
연산자 우선순위로 인해 p가 가리키는 위치의 값을 가져온 뒤 p의 값(주소)을 증가시킨다.
(*p)++;
p가 가리키는 위치의 값을 가져와 증가시킨다.
후위 연산자( a++ )가 전위 연산자( ++a )보다 우선순위가 높음
수식 | 의미 |
---|---|
v = *p++ | p가 가리키는 값을 v에 대입한 후에 p를 증가한다. |
v = (*p)++ | p가 가리키는 값을 v에 대입한 후에 가리키는 값을 증가한다. |
v = *++p | p를 증가시킨 후에 p가 가리키는 값을 v에 대입한다. |
v = ++*p | p가 가리키는 값을 가져온 후에 그 값을 증가하여 v에 대입한다. |
포인터는 배열처럼 사용 가능하다.
배열의 이름은 배열 시작 주소를 가리킨다.
int n[10];
int *p = n; // p가 배열 시작 주소를 가리킴
n[5] = 8 // 배열 n의 시작 위치의 주소에서 5만큼 떨어진 주소에 8 저장
n + 5; // n = 배열 시작 주소 -> n + 5 == &n[5]
*(n + 5) = 8; // n[5]에 8 저장
p = p + 7; // p가 시작 주소였으므로 p + 7 == &n[7]
*p = 99; // n[7]에 99 저장
이때 p = a; 라고 하면 p[0], p[1] 같이 포인터를 배열처럼 사용할 수도 있다.
-> 함수 매개변수로 배열을 사용하는 것과 배열을 가리키는 포인터를 사용하는 것은 같다.
but, 포인터 사용이 인덱스 사용보다 빠르다.
int n[10];
int i;
int *p;
for(i = 0; i < 10; i++)
*(n + i) = i * 3; // 배열의 이름 n을 주소처럼 사용 가능
// 배열 n을 3의 배수로 채움
p = n; // 포인터 p에 배열 n의 시작 주소 설정
for(i = 0; i < 10; i++)
printf("%d ", *(p + i)); // 포인터 p를 이용하여 n의 원소에 접근
printf("\n");
for(i = 0; i < 10; i++){
*p = *p + 2; // 포인터 p를 이용하여 배열 원소 값 2 증가
p++; // 다음 원소 주소로 이동
}
for(i = 0; i < 10; i++)
printf("%d", n[i]); // 인덱스를 이용하여 원소에 접근
printf("\n");