728x90
함수에서 배열을 가져다 쓰고싶을 수 있다.
이때는 배열의 크기도 함께 매개변수에 추가하여 보내주어야 한다.
함수 내에서 정수형태로 입력을 그냥 해줘도 상관은 없지만, 유지보수할때 놓칠 가능성이 높다.(내생각)
배열을 포인터를 통해 받게되면 포인터는 배열의 가장 앞쪽 [0]번째 인덱스 주소만을 가르키고 있기 때문에
배열 전체의 사이즈를 알 수 없다.
따라서 배열 크기를 넘어서는 값을 참조하게 될경우, 다른 메모리를 덮어 써버릴 수 있다.
(예전에는 이런문제들 때문에 블루스크린등 문제가 많이 발생했었다고 한다.)
#include <iostream>
using namespace std;
void ArrayFunc(int* ptrArray);
void ArrayFunc2(int* ptrArray, int arraySize);
int main()
{
int numbers[10] = {0,};
for(int i = 0; i < 10; i++)
{
numbers[i] = (i+1)*10;
}
for(int i = 0; i<10; i++)
{
printf("%d ",numbers[i]);
}
printf("\n");
int *ptrNumber = &numbers[2];
printf("3번째 자리에 있는 값 + 1 -> %d \n", *(ptrNumber+1)); //40
printf("3번째 자리에 있는 값 + 1 -> %d \n", *ptrNumber+1); // 31
//{numbers와 numbers[0]의 주소는 같다.
printf("numbers 가 들고 있는 값 -> %p \n", numbers);
printf("numbers[0]의 주소 값 -> %p \n", &numbers[0]);
//numbers와 numbers[0]의 주소는 같다.}
ArrayFunc(numbers);
ArrayFunc2(numbers, 10);
}
void ArrayFunc(int* ptrArray)
{
//배열을 역참조(포인터)로 받게되면 배열의 크기를 체크할 수 없다.
//다른 메모리를 덮어써버릴 수도있다.(배열의 크기를 넘어서는 값을 참조하게 되면)
//10
printf("ptrArray 역참조 값 : %d \n", *(ptrArray));
//100
printf("ptrArray + 1 주소의 역참조 값 : %d \n", *(ptrArray+9));
//357498393 (배열크기 10을 초과한 값, 어떤값이 있을지 알 수 없다.)
printf("ptrArray + 1 주소의 역참조 값 : %d \n", *(ptrArray+10));
//사이즈가 3이나 초과하여 역시나 어떤값이 있을지 알 수 없다.
printf("ptrArray + 1 주소의 역참조 값 : %d \n", *(ptrArray+12));
}
// 배열은 사이즈를 넘겨서 처리해줘야함.
void ArrayFunc2(int* ptrArray, int arraySize)
{
for(int i = 0; i<arraySize; i++)
{
printf("ptrArray 역참조 값 : %d \n", *(ptrArray+i));
}
}
728x90
'프로그래밍 > C,C++' 카테고리의 다른 글
#include <cmath> 공부, 코딩테스트 (0) | 2023.07.18 |
---|---|
[C/C++] 이차원 배열 이해하기 + 숫자 슬라이드 퍼즐_예제 (0) | 2023.06.11 |
[C,C++] 기본 3가지 정렬(선택정렬, 버블정렬, 삽입정렬) (0) | 2023.06.11 |
[C/C++] 문자열 할당 및 출력하기 예제 (0) | 2023.06.07 |
[C/C++] 예제_영어 문자열을 입력받아 대-소-대-소문자로 변경하기 (0) | 2023.06.07 |