
배열명은 컴파일 과정에서 해당 배열의 첫 번째 요소의 주소로 해석되며, 포인터 연산을 통해 나머지 요소에도 접근할 수 있습니다.
#include <stdio.h>, int main(void), return 0; 등 구문은 특별히 필요하지 않은 경우 생략합니다.int arr[3]이 메모리 100번지부터 할당되면, 각 요소의 주소는 100, 104, 108번지arr은 첫 배열 요소의 주소 100으로 해석됨주소 + 정수 -> 주소 + (정수 * 주소에 위치한 변수의 크기)int형 변수 a의 주소 100번지에 1을 더하면&a + 1 -> 100 + 1 * 4 -> 104포인터 + 정수 -> 포인터가 가리키는 주소 + (정수 * 포인터가 가리키는 자료형의 크기)`int arr[3];
*(arr + 0) = 5; // arr[0] = 5
*(arr + 1) = *(arr + 0) + 5; // arr[1] = arr[0] + 5
*(arr + 2) = 15; // scanf("%d", &arr[2])
// arr[0], arr[1], arr[2] 출력
for (int i = 0; i < 3; i++){
printf("%3d", *(arr + i));
}
// [출력] 5 10 15

arr이 메모리 100번지부터 할당되었다고 가정하면int는 4바이트, 각 요소는 100, 104, 108번지에 할당됨arr의 값은 100 (첫번째 요소의 주소)int는 4바이트므로, 1을 더할 때마다 주소가 4만큼 증가*(arr + 0) -> *100 -> 첫번째 요소 arr[0]*(arr + 1) -> *104 -> 두번째 요소 arr[1]*(arr + 2) -> *108 -> 세번째 요소 arr[2]arr[i]는 *(arr + i)와 동일한 표현int arr[3];
int *pa = arr; // 포인터 pa에 배열명 arr 저장
*pa = 5; // arr[0]에 5 대입
*(pa + 1) = 10; // arr[1]에 10 대입
pa[2] = pa[0] + pa[1]; // arr[2]에 5 + 10 = 15 대입
for (int i = 0; i < 3; i++){
printf("%3d", pa[i]);
}
// [출력] 5 10 15

int*형 포인터 pa에 배열명 arr 저장pa는 배열 arr의 첫 요소를 가리킴pa에도 주소 연산, 대괄호 인덱싱 사용 가능pa[1], *(pa + 1), (arr + 1), arr[1]은 모두 arr의 두번째 요소를 나타냄sizeof 연산sizeof(배열명): 배열 전체의 크기sizeof(포인터): 포인터 하나의 크기 (8바이트 고정)int arr[3];
int* pa = arr;
printf("%d\n", sizeof(arr)); // 12 (4바이트 * 3)
printf("%d\n", sizeof(pa)); // 8 (포인터는 8바이트)
arr++ 같은 연산 불가능int arr[3] = {42, 13, 9};
int* pa = arr; // arr의 첫 요소 가리키게 초기화
for (int i = 0; i < 3; i++){
printf("%4d", *pa); // 현재 가리키는 값 출력
pa++; // 실제로는 다음 배열 요소를 가리키도록 4 증가
}
// [출력] 42 13 9
*pa: pa가 가리키는 값pa가 arr의 첫번째 요소를 가리키도록 초기화pa++: 1을 증가시킬 때마다 주소가 4 증가하여 다음 요소를 가리킴주소의 차 / 가리키는 자료형의 크기int arr[5] = {11, 22, 33, 44, 55};
int* pa = arr; // arr[0]을 가리킴
int* pb = arr + 3; // arr[3]을 가리킴
printf("pb - pa: %d\n", pb - pa);
// [출력] pb - pa = 3
printf("앞의 값: %d", pa < pb ? *pa : *pb);
// [출력] 앞의 값: 11

arr[3]을 가리키는 pb에서 arr[0]을 가리키는 pa를 빼면 (112 - 100) // 4 = 3#include <stdio.h>
void input_array(double *pa, int size);
double find_max(double *pa, int size);
int main(void){
double arr[4];
double max;
int length = sizeof(arr) / sizeof(arr[0]);
input_array(arr, length); // 값 입력
max = find_max(arr, length); // 최댓값 찾고 저장
printf("최댓값: %.1lf\n", max);
return 0;
}
// double* 포인터를 매개변수로 선언 -> 배열명을 받기 위해
void input_array(double *pa, int length){
printf("%d개의 실수 값 입력: ", length);
for (int i = 0; i < length; i++){
scanf("%lf", pa + i); // 입력할 배열 요소의 주소 전달
}
}
// double* 포인터를 매개변수로 선언 -> 배열명을 받기 위해
double find_max(double *pa, int length){
double max;
max = pa[0];
for (int i = 1; i < length; i++){
if (pa[i] > max) max = pa[i];
}
return max;
}
// [입력] 5개의 실수값 입력: 3.4 6.7 2.5 7.3 4.5
// [출력] 배열의 최댓값: 7.3
arr는 배열의 첫번째 요소의 주소double *형 포인터 매개변수로 받음pa[i]로 배열 요소에 접근 - *(pa + i)와 같은 의미scanf에서 입력받을 때는 주소가 필요하므로, 배열 요소의 주소를 pa + i로 넘겨줌pa + i 자체가 주소이므로, &는 붙이지 않아도 됨&pa[i]로 넘겨줘도 결과는 같음🤔 input_array, find_max가 아니라 main에서 배열의 길이를 계산한 이유가 있나요?
sizeof(arr)은 배열의 크기를 반환하지만,sizeof(pa)는 포인터의 크기인 8바이트만을 반환하므로 배열의 길이를 계산할 수 없습니다.1~45 중에 6개의 서로 다른 수를 배열에 입력하고 출력합니다. 입력한 수가 이미 저장된 수와 같으면 에러 메시지를 출력하고 다시 입력합니다.
input_nums: int *형 lotto_nums 포인터를 사용해서, 주소 lotto_nums + i에 값을 입력flag은 1. 1~45 사이 값이 아니거나 중복값인 경우, flag를 0으로 설정flag == 0인 경우 i가 1 줄어듦print_nums: int *형 lotto_nums 포인터를 사용해서, lotto_nums[i]로 값을 출력#include <stdio.h>
void input_nums(int *lotto_nums);
void print_nums(int *lotto_nums);
int main(void){
int lotto_nums[6];
input_nums(lotto_nums);
print_nums(lotto_nums);
return 0;
}
void input_nums(int* lotto_nums){
for (int i = 0; i < 6; i++){
int flag;
flag = 1; // 올바른 입력이 아닐 시 0
printf("번호 입력: ");
scanf("%d", lotto_nums + i);
if (lotto_nums[i] < 1 || 45 < lotto_nums[i]){
flag = 0;
printf("수는 1~45 사이 값이여야 합니다!\n");
}
for (int j = 0; j < i; j++){
if (lotto_nums[i] == lotto_nums[j]){
flag = 0;
printf("같은 번호가 있습니다!\n");
break;
}
}
// 올바른 입력이 아닐 때만 실행됨
if (flag) i--;
}
}
void print_nums(int* lotto_nums){
printf("로또 번호: ");
for (int i = 0; i < 6; i++){
printf("%-4d", lotto_nums[i]);
}
}
// [실행결과]
// 번호 입력: 3
// 번호 입력: 7
// 번호 입력: 15
// 번호 입력: 3
// 같은 번호가 있습니다!
// 번호 입력: 22
// 번호 입력: 35
// 번호 입력: -5
// 수는 1~45 사이 값이여야 합니다!
// 번호 입력: 100
// 수는 1~45 사이 값이여야 합니다!
// 번호 입력: 40
// 로또 번호: 3 7 15 22 35 40