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");
}