Tech Blog/C and C++
C언어 - 포인터와 배열
EXPRESSIONS HAVE POWER
2021. 6. 9. 17:32
1. 포인터와 배열로 값 호출하기 (서로 비교)
#include <stdio.h>
int main(){
// 배열
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]);
}
return 0;
}
실행결과
배열 arr[0] 의 값 : 5
배열 arr[1] 의 값 : 10
배열 arr[2] 의 값 : 15
배열 ptr[0] 의 값 : 5
배열 ptr[1] 의 값 : 10
배열 ptr[2] 의 값 : 15
1. 포인터와 배열로 주소 및 값 호출하기 (서로 비교)
#include <stdio.h>
int main(){
// 배열
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]);
}
ptr[0] = 100;
ptr[1] = 200;
ptr[2] = 300;
for(int i=0; i<3;i++)
{
// printf("배열 arr[%d] 의 값 : %d\n", i, arr[i]);
printf("배열 arr[%d] 의 값 : %d\n", i, *(arr + i));
}
for(int i=0; i<3;i++)
{
printf("배열 ptr[%d] 의 값 : %d\n", i, *(ptr + i));
}
// *(arr + i) == arr[i] 똑같은 표현
// arr == arr 배열의 첫번째 값의 주소와 동일 == &arr[0]
printf("arr 자체의 값 : %d\n", arr);
printf("arr[0] 의 주소 : %d\n", &arr);
printf("arr 자체의 값이 가지는 주소의 실제 값: %d\n", *arr); // *(arr + 0)
printf("arr[0]의 실제 값: %d\n", *&arr[0]);
// *& 는 아무것도 없는 것과 같다. &는 주소이며, *는 그 주소의 값이기 때문에
// *& 는 서로 상쇄된다.
printf("\n\n*&는 서로 상쇄된다.\n\n");
printf("arr[0]의 실제 값: %d\n", *&*&*&*&*&arr[0]);
printf("arr[0]의 실제 값: %d\n", arr[0]);
return 0;
}
실행결과
배열 arr[0] 의 값 : 5
배열 arr[1] 의 값 : 10
배열 arr[2] 의 값 : 15
배열 ptr[0] 의 값 : 5
배열 ptr[1] 의 값 : 10
배열 ptr[2] 의 값 : 15
배열 arr[0] 의 값 : 100
배열 arr[1] 의 값 : 200
배열 arr[2] 의 값 : 300
배열 ptr[0] 의 값 : 100
배열 ptr[1] 의 값 : 200
배열 ptr[2] 의 값 : 300
arr 자체의 값 : -427641220
arr[0] 의 주소 : -427641220
arr 자체의 값이 가지는 주소의 실제 값: 100
arr[0]의 실제 값: 100
*&는 서로 상쇄된다.
arr[0]의 실제 값: 100
arr[0]의 실제 값: 100
3. 포인터로 배열 값 변경해보기.
#include <stdio.h>
void changeArray(int * ptr);
int main(){
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)
{
ptr[2] = 50;
}
실행결과
10
20
50
#include <stdio.h>
void changeArray(int * ptr);
int main(){
int arr2[3] = {10, 20, 30};
changeArray(&arr2[0]);
for(int i=0; i<3; i++)
{
printf("%d\n", arr2[i]);
}
return 0;
}
void changeArray(int * ptr)
{
ptr[2] = 50;
}
- main함수내에서 changeArray 함수를 사용할 때
changeArray(arr2);의 실행결과와
changeArray(&arr2[0]);의 실행결과가 같다.
그렇기에,
첫 번째 해당하는 배열의 주소를 던져서 거기로부터 3번째 위치의 배열의 값을 바꾸는 것은 올바른 동작이라고 볼 수 있다.