배열의 주소는 연속되어있다. 배열의 이름은 포인터 변수와 같은 기능을 하며, 첫번째 요소의 주소값을 타나낸다.
#include <stdio.h>
int main()
{
int arr[5] = {10, 20, 30, 40, 50};
int *arrPtr = arr;
printf("%d\n", *arrPtr);
printf("%d\n", arr[0]);
return 0;
}
10
10
위와 같이 & 연산자를 쓰지 않아도 arr 이름 자체가 주소값이기 때문에, 바로 포인터에 대입이 가능하다. arr 이름은 배열의 첫번째 원소의 주소값이므로 arrPtr이 가리키고 있는 값을 출력해보면 첫번째 원소값인 10이 출력된다.
scanf
로 입력받을 때, 배열 이름이 주소값이기 때문에 굳이 &연산자를 붙여서 주소값을 나타내줄 필요가 없는 것이다.
포인터 변수도 일반 변수처럼 값이 들어가 있는 변수기 때문에 증감 연산을 할 수 있다. ++, --와 같은 전/후위 연산과 +,-연산자 같은 일반 덧셈과 뺄셈이 가능하다. 단, 곱셈, 나눗셈 연산은 하지 못합니다.
#include <stdio.h>
int main()
{
int arr[5] = {10, 20, 30, 40, 50};
double arr2[5] = {10.1, 20.2, 30.3, 40.4, 50.5};
int *arrPtr = arr;
double *arrPtr2 = arr2;
printf("포인터 주소 : %d %d\n", arrPtr++, arrPtr2++);
printf("증가 연산 후 : %d %d\n", arrPtr, arrPtr2);
printf("변수 값 : %d %.2f\n", *arrPtr, *arrPtr2);
arrPtr += 2;
arrPtr2 += 2;
printf("증가 연산 후 : %d %d\n", arrPtr, arrPtr2);
printf("변수 값 : %d %.2f\n", *arrPtr, *arrPtr2);
return 0;
}
포인터 주소 : 3826688 3826720
증가 연산 후 : 3826692 3826728
변수 값 : 20 20.20
증가 연산 후 : 3826700 3826744
변수 값 : 40 40.40
int형 포인터인 arrPtr는 1을 더할때마다 4씩 증가하고, double형 포인터인 arrPtr2는 8씩 증가하고, 2를 더했더니 arrPtr은 8, arrPtr2는 16만큼 증가한다.
즉, 포인터 변수가 n만큼 더하거나 뺄 때 자료형의 크기 x n 만큼 증가한다는 것이다. 감소 연산도 동일하다.
그러므로, 포인터의 이름은 배열의 첫번째 원소의 주소를 가리키므로, i x 자료형의 크기만큼 더해지면 결국 배열 i와 같게 되는 것이다.
*(arr+i) == arr[i]
#include <stdio.h>
void bubbleSort(int *arr)
{
int temp;
for(int i=0; i<9; i++)
{
for(int j=0; j<9-i; j++)
{
if(*(arr+j)>*(arr+j+1))
{
temp = *(arr+j);
*(arr+j) = *(arr+j+1);
*(arr+j+1) = temp;
}
}
}
}
int main()
{
int arr[10];
for(int i=0; i<10; i++)
{
scanf("%d", &arr[i]);
}
bubbleSort(arr);
for(int i=0; i<10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
10 5 8 2 9 1 4 6 11 15
1 2 4 5 6 8 9 10 11 15