#include <stdio.h>
int main(void)
{
int arr[3] = {5, 10, 15};
int *ptr = arr;
return 0;
}
만약 arr을 이렇게 선언했다면, arr은 배열의 시작점 주소를 의미함
ptr = arr
arr[0] = *arr
arr[1] = *(arr + 1)
arr[2] = *(arr + 2)
#include <stdio.h>
int main(void)
{
int arr[3] = {5, 10, 15};
int *ptr = arr;
for (int i = 0; i < 3; i++)
{
printf("배열 arr[%d]의 값 : %d\n", i, arr[i]);
}
for (int i = 0; i < 3; i++)
{
printf("포인터 ptr[%d]의 값 : %d\n", i, ptr[i]);
}
for (int i = 0; i < 10; i++)
{
printf("======");
}
printf("\n");
ptr[0] = 100;
ptr[1] = 200;
ptr[2] = 300;
for (int i = 0; i < 3; i++)
{
printf("배열 arr[%d]의 값 : %d\n", i, arr[i]); // arr이라는 것은 정확히는 arr이 가장 처음 시작되는 주소값이라는 것을 가지고 있음
}
for (int i = 0; i < 3; i++)
{
printf("배열 arr[%d]의 값 : %d\n", i, *(arr + i)); // 이건 그 주소로부터 i번째에 해당하는 녀석의 값을 가져온다는 뜻임
}
for (int i = 0; i < 3; i++)
{
printf("포인터 ptr[%d]의 값 : %d\n", i, ptr[i]);
}
for (int i = 0; i < 3; i++)
{
printf("포인터 ptr[%d]의 값 : %d\n", i, *(ptr + i)); // 얘도 똑같음
}
for (int i = 0; i < 10; i++)
{
printf("======");
}
printf("\n");
/* *(arr + i) == arr[i] 똑같은 표현
arr == arr배열의 첫번째 값의 주소와 동일 == &arr[0] */
printf("arr 자체의 값 : %d\n", arr);
printf("arr[0]의 주소 : %d\n", &arr[0]); // 값을 보면 똑같다는 것을 알 수 있음
printf("arr 자체의 값이 가지는 주소의 실제 값 : %d\n", *arr);
printf("arr[0]의 실제 값 : %d\n", &arr[0]);
return 0;
}
swap 함수는 값에 의한 복사
swap_addr은 call by address (주소값에 의한 복사)
#include <stdio.h>
void swap(int a, int b);
void swap_addr(int *a, int *b);
int main(void)
{
int a = 10;
int b = 20;
printf("swap함수밖의 a 주소값 : %d\n", &a);
printf("swap함수 사용 전 --> a : %d, b : %d\n\n", a, b);
swap(a, b);
printf("swap함수 사용 후 --> a : %d, b : %d\n\n", a, b);
/* 이렇게 나오는 이유는 값에 의한 복사 (Call by Value) 때문
--> 값만 복사한다는 의미, 주소값으로 확인하면 다르게 나옴 */
for (int i = 0; i < 15; i++)
{
printf("======");
}
printf("\n\n");
printf("주소값을 넘겨줘보기\n\n");
swap_addr(&a, &b);
return 0;
}
void swap(int a, int b)
{
printf("swap함수내의 a 주소값 : %d\n", &a); // 이게 값에 의한 복사임
int temp = a;
a = b;
b = temp;
printf("swap함수내에서 사용 후 --> a : %d, b : %d\n\n", a, b);
}
void swap_addr(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
printf("주소값으로 넘겨준 후 --> a : %d, b : %d\n", *a, *b);
} // 주의사항은 함수 처음 선언부터 아래 사용까지 a, b앞에는 전부 *을 붙여줘야 한다는 것
#include <stdio.h>
void changeArray(int *ptr); // 3번째 값을 50으로 바꾸는 함수
int main(void)
{
int arr2[3] = {10, 20, 30};
changeArray(arr2);
for (int i = 0; i < 3; i++) {
printf("%d\n", arr2[i]);
}
return 0;
}
void changeArray(int *ptr) // 위의 swap예제와 동일하게 주소값으로 처리함
// int *ptr = arr2의 주소값 (= &arr2[0])이 됨
{
ptr[2] = 50;
}