배열은 메모리에 연속으로 붙어 있는 “방들”이에요. 배열 이름은 사실 “첫 번째 방의 주소”를 가리켜요. 아래 코드는 [실행]으로 바로 결과를 볼 수 있어요.
p가 첫 번째 칸을 가리키고, p+1은 다음 칸(두 번째)을 가리켜요. 그래서 *(p+1)은 arr[1]과 같아요.
함수에 “값”을 넘기면 복사만 되고, 원래 변수는 안 바뀌어요. “주소”를 넘기면 함수 안에서 그 주소의 값을 바꿀 수 있어요.
#include <stdio.h>
void 더하기_하다(int *p) {
*p = *p + 5; /* p가 가리키는 곳의 값을 5 증가 */
}
int main() {
int num = 10;
printf("전: %d\n", num);
더하기_하다(&num); /* num의 주소를 넘김 */
printf("후: %d\n", num); /* 15가 됨 */
return 0;
}
&num으로 주소를 넘기니까, 함수 안에서 *p로 그 방의 값을 바꿀 수 있어요. 그래서 num이 15가 돼요.
*(p+i)처럼 쓸 수 있어요.&변수)를 넘기면, 함수 안에서 포인터로 그 변수의 값을 바꿀 수 있어요.arr[] = { 10, 20, 30 }을 포인터 p로 받아서, for 반복문으로 *(p+i)를 사용해 모든 원소를 한 줄에 출력하세요.
모바일에서도 이 창에서 수정·포맷·실행·복사할 수 있어요. [실행]으로 바로 결과를 볼 수 있습니다.
#include <stdio.h>
int main() {
int arr[3] = { 10, 20, 30 };
int *p = arr;
for (int i = 0; i < 3; i++)
printf("%d ", *(p + i));
printf("\n");
return 0;
}
sum_arr(int *p, int n)을 만드세요. main에서 배열을 선언하고 sum_arr(arr, 3)을 호출해 합을 출력하세요.
여기서 직접 작성·실행해 보세요. [실행]으로 결과를 확인할 수 있어요.
#include <stdio.h>
int sum_arr(int *p, int n) {
int sum = 0;
for (int i = 0; i < n; i++)
sum += *(p + i);
return sum;
}
int main() {
int arr[3] = { 10, 20, 30 };
printf("합: %d\n", sum_arr(arr, 3));
return 0;
}
포인터 연산: p+1이 실제로 더해지는 값
int *p일 때 p+1은 “다음 정수”를 가리켜요. 정수는 4바이트이므로, 실제 주소에는 4가 더해져요. 컴파일러가 자동으로 계산해 줍니다.
#include <stdio.h>
int main() {
int arr[3] = { 10, 20, 30 };
int *p = arr;
printf("p 주소: %p\n", (void*)p);
printf("p+1 주소: %p\n", (void*)(p+1));
printf("p+2 주소: %p\n", (void*)(p+2));
return 0;
}
이중 포인터 맛보기
int **pp는 “정수 포인터의 주소”를 저장해요. 즉, 포인터를 가리키는 포인터예요. 나중에 동적 메모리나 함수에서 포인터를 바꿀 때 쓰게 됩니다.