C 언어에서 포인터 변수끼리의 비교는 그들이 가르키는 메모리 주소를 비교한다. 즉, 두 포인터가 같은 메모리 위치를 가리키고 있는지를 확인하는 것이다. 포인터가 동일한 메모리 주소를 가리키고 있는지를 확인하려면 주소값을 비교해야 한다.
#include <stdio.h>
int main() {
int a = 5, b = 10;
int *ptr1 = &a;
int *ptr2 = &a;
int *ptr3 = &b;
// 포인터 주소값 비교
if (ptr1 == ptr2) {
printf("ptr1 and ptr2 point to the same address.\n");
} else {
printf("ptr1 and ptr2 point to different addresses.\n");
}
if (ptr1 == ptr3) {
printf("ptr1 and ptr3 point to the same address.\n");
} else {
printf("ptr1 and ptr3 point to different addresses.\n");
}
return 0;
}
ptr1과 ptr2는 둘 다 변수 a의 주소를 가리키므로, ptr1 == ptr2는 참(True).ptr1과 ptr3는 각각 변수 a와 b의 주소를 가리키므로, ptr1 == ptr3는 거짓(False).ptr1 and ptr2 point to the same address.
ptr1 and ptr3 point to different addresses.
배열은 기본적으로 첫 번째 요소의 주소값을 나타내는 특성을 가진다. 하지만 배열 이름 자체는 포인터가 아니기에 배열의 이름은 상수 포인터처럼 동작하여 배열의 시작 주소를 가리킨다.
배열을 비교할 때 배열은 그 배열의 첫 번째 요소의 주소를 나타내므로, 주소값을 비교하게 된다. 하지만 배열의 값(내용)을 직접 비교하는 것은 불가능하고, 배열의 요소 하나하나를 순회하며 값을 비교해야 한다.
int arr1[] = {1, 2, 3};
int arr2[] = {1, 2, 3};
if (arr1 == arr2) {
printf("arr1 and arr2 are the same address.\n");
} else {
printf("arr1 and arr2 are different addresses.\n");
}
arr1 == arr2는 두 배열의 주소값을 비교하는 것이며, 배열은 서로 다른 메모리 공간에 할당되기 때문에 arr1과 arr2는 다른 주소를 가리킴.arr1 and arr2 are different addresses.
배열의 값을 비교하고 싶다면, 직접 반복문을 통해 요소를 하나씩 비교하거나 memcmp 같은 함수를 사용할 수 있다.
int same = 1;
for (int i = 0; i < 3; i++) {
if (arr1[i] != arr2[i]) {
same = 0;
break;
}
}
if (same) {
printf("arr1과 arr2의 값이 같습니다.\n");
} else {
printf("arr1과 arr2의 값이 다릅니다.\n");
}