Trivia
2강.포인터(2) 본문
1.4 포인터 연산
▶덧셈, 뺄셈 연산
- 포인터 변수에 대한 연산은 일반적인 변수에 대한 연산과는 약간 상이
- 증가, 감소되는 값은 포인터가 가리키는 객체의 크기
cf) 객체의 크기에 따라서 증가, 감소되는 값이 달라짐
포인터 타입 |
++연산 후 증가되는 값 |
char |
1 |
int |
4 |
float |
4 |
double |
8 |
ex) 예제 프로그램 : 포인터의 증감연산
//포인터의 증감 연산
#include <stdio.h>
int main()
{
char *pc;
int *pi;
double *pd;
pc=(char *)10000;
pi=(int *)10000;
pd=(double *)10000;
printf("증가 전 pc=%d, pi=%d, pd=%d\n", pc, pi, pd);
pc++;
pi++;
pd++;
printf("증가 후 pc=%d, pi=%d, pd=%d\n", pc, pi, pd);
return 0;
}
증가 전 pc=10000, pi=10000, pd=10000
증가 후 pc=10001, pi=10004, pd=10008
▶간접 참조 연산자와 증가 연산자
- *p++; : p가 가리키는 위치에서 값을 가져온 후에 p를 증가 (주소값↑)
- (*p)++; : p가 가리키는 위치의 값을 증가 (데이터값↑)
수식 |
의미 |
v = *p++ |
p가 가리키는 값을 v에 대입한 후, p를 증가 |
v = (*p)++ |
p가 가리키는 값을 v에 대입한 후, 가리키는 값을 증가 |
v = *++p |
p를 증가시킨 후에 p가 가리키는 값을 v에 대입 |
v = ++*p |
p가 가리키는 값을 가져온 후, 그 값을 증가하여 v에 대입 |
ex) 예제 프로그램 : 포인터의 증감연산(2)
//포인터의 증감연산
#include <stdio.h>
int main()
{
int i = 39;
int *pi=&i;
printf("i = %d, pi = %p\n", i, pi);
(*pi)++; //pi가 가리키는 위치의 값을 증가
printf("i = %d, pi = %p\n", i, pi);
*pi++; //pi가 가르키는 위치에 값을 가져온 후에 pi를 증가
printf("i = %d, pi = %p\n", i, pi);
return 0;
}
i = 39, pi = 0060FF08
i = 40, pi = 0060FF08
i = 40, pi = 0060FF0C
▶포인터의 형변환
- 형변환 연산자를 포인터 변수 앞에 기술
- 누락 시 컴파일 경고 발생
1.5 포인터와 배열
▶포인터와 배열은 아주 밀접한 관계
ex) 예제 프로그램 : 포인터와 배열의 관계
//포인터와 배열의 관계
#include <stdio.h>
int main()
{
int a[] = {10, 20, 30, 40, 50};
printf("a = %u\n", a);
printf("a+1 = %u\n", a+1);
printf("*a = %d\n", *a);
printf("*(a+1) = %d\n", *(a+1));
return 0;
}
a = 6356732
a+1 = 6356736
*a = 10
*(a+1) = 20
▶인덱스 표기법을 포인터에 사용 가능
ex) 예제 프로그램
//포인터를 배열 이름처럼 사용
#include <stdio.h>
int main()
{
int a[] = {10, 20, 30, 40};
int *p;
p=a;
printf("a[0]=%d, a[1]=%d, a[2]=%d\n", a[0], a[1], a[2]);
printf("p[0]=%d, p[1]=%d, p[2]=%d\n", p[0], p[1], p[2]);
p[0] = 60;
p[1] = 70;
p[2] = 80;
printf("\n");
printf("a[0]=%d, a[1]=%d, a[2]=%d\n", a[0], a[1], a[2]);
printf("p[0]=%d, p[1]=%d, p[2]=%d\n", p[0], p[1], p[2]);
return 0;
}
a[0]=10, a[1]=20, a[2]=30
p[0]=10, p[1]=20, p[2]=30
a[0]=60, a[1]=70, a[2]=80
p[0]=60, p[1]=70, p[2]=80
▶포인터를 사용한 방법의 장점
- 원소의 주소를 계산할 필요가 없기 때문에 인덱스 표기법보다 처리가 빠름
<인덱스 표기법 사용>
int get_sum(int a[], int n)
{
int i;
int sum = 0;
for(i = 0; i < n; i++)
sum += a[i];
return sum;
}
<포인터 사용>
int get_sum2(int a[], int n)
{
int i;
int *p;
int sum = 0;
p = a;
for(i = 0; i < n; i++)
sum += *p++;
return sum;
}