- 포인터와 배열의 관계
int arr[10];
int *p;
// 아래의 두 코드는 동일
p = &arr[0];
p = arr; // 배열 이름 자체가 배열의 첫 번째 요소의 메모리 주소를 나타내는 상수
- 포인터 연산
- p++ / p-- : p가 배열을 가리키는 포인터 변수인 경우, 인덱스 이동과 동일 (자료형의 크기만큼 주소 증감)
- 포인터와 다차원 배열
#include <stdio.h>
#define ROW 2
#define COL 2
int main() {
int arr[ROW][COL] = { {1, 2},
{3, 4} };
int *p; // 포인터 변수 선언
for (p = &arr[0][0]; p <= &arr[ROW-1][COL-1]; p++) {
// p는 arr의 1행 1열을 가리키는 포인터 변수
printf("%d ", *p); // 여기서의 *p 는 포인터 변수 p가 가리키는 값
}
printf("\n");
int (*q)[COL]; // 길이가 COL인 int 배열을 가리키는 포인터 변수
for (q = &arr[0]; q <= &arr[ROW-1]; q++) {
// q는 arr의 n행 1열을 가리키는 포인터 변수
printf("%d ", *q[0]);
}
printf("\n");
return 0;
};
+ 함수의 매개변수를 배열로 선언하고자 할 때, int a[]와 int *a는 동일 (배열 전체를 복사해서 전달 X > 배열의 첫 번째 주소를 전달)
- 예제
- 버블 정렬
#include <stdio.h>
#include <stdlib.h>
void bubble_sort(int arr[], int n, int (*compare)(int, int)) { // compare는 함수 포인터
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (compare(arr[j], arr[j + 1]) < 0) { // 두 원소의 위치를 바꾸는 동작
int temp = arr [j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
// 정렬이 필요한 경우 -> 반환값 < 0
int ascending(int a, int b) { // 오름차순
return (b - a);
}
int descending(int a, int b) { // 내림차순
return (a - b);
}
void print_array(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int *arr = NULL;
int n = 0;
printf("Enter number of elements: ");
scanf("%d", &n);
arr = (int *)malloc(n * sizeof(int)); // 동적 메모리 할당
printf("Enter %d elements: \n", n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
bubble_sort(arr, n, ascending);
printf("Sorted array in ascending order: \n");
print_array(arr, n);
bubble_sort(arr, n, descending);
printf("Sorted array in descending order: \n");
print_array(arr, n);
free(arr);
return 0;
}'Coding > C' 카테고리의 다른 글
| 13. 구조체(struct), 열거형(enum), 동적 메모리 할당(malloc), 연결 리스트 (0) | 2025.12.15 |
|---|---|
| 12. 문자열 (0) | 2025.11.29 |
| 10. 포인터 (0) | 2025.11.21 |
| 09. 변수의 범위와 지속기간 (0) | 2025.11.21 |
| 08. 함수 (0) | 2025.10.17 |