반응형
배열의 이름
배열의 이름은 배열의 시작 주소 값을 의미하는 포인터(배열의 첫 번째 요소)입니다.
단순히 주소 값이 아닌 포인터인 이유는 메모리 접근에 사용되는 * 연산이 가능하기 때문입니다.
배열의 모든 요소는 붙어있다. 그래서 배열의 요소들의 주소값은 연속된 값이다.
그렇다면 배열 이름과 포인터 변수는 같은 용도냐?
그것은 아닙니다 아래의 표에서 둘의 차이점을 알아보겠습니다

포인터 변수는 주소를 변경가능하지만
배열은 주소가 고정되기에 포인터 변수처럼
주소값 변경이 불가능합니다.
1차원 배열 이름의 포인터형
아래의 코드에서 int형 포인터인 arr1은 *연산의 결과 4바이트 메모리 공간에 정수를 저장한다.
double형 포인터 arr2는 8바이트 메모리 공간에 실수를 저장한다.
int arr1[3] = {10,20,30};
double arr2[3] = {1.1, 2.2, 3.3};
*arr1 += 100;
*arr2 += 120.5;
printf("%d %g \n", arr1[0], arr2[0]); // 101 121.6
포인터의 배열접근
아래의 코드에서 포인터 변수 또한 배열처럼 메모리 공간에 접근이 가능하다는 것을 알 수 있습니다.
int arr[5] = {1,2,3,4,5};
int arrLen = sizeof(arr) / sizeof(int); // 배열의 길이
int* ptr = &arr[0]; // int* ptr = arr; 배열의 이름은 배열의 시작주소와 같다.
for(int i = ; i < arrLen; i++)
{
printF("%d %d \n", ptr[i], arr[i]); // 1 1 / 2 2 / 3 3 / 4 4 / 5 5
}
포인터와 배열의 관계 정리
포인터와 배열은 같다.
arr은 int형 배열이다.
ptr은 int형 포인터이다.
배열의 변수명은 배열의 시작주소를 의미합니다.
int형 포인터를 선언하는곳에
배열을 넣으면 정상적으로 작동합니다.
int형 포인터는 주소의 값을 담습니다.
그곳에 배열 변수명을 할당해주면 배열의 변수명은
배열의 시작주소를 뜻하기에 할당이 가능합니다.
이는 곧 int형 배열은 int형 포인터와 같다는 뜻입니다!
int arr[3] = {10, 20, 30}
int* ptr = arr; // 컴파일 성공!
이미지 출처 : 윤성우의 열혈 C 프로그래밍
반응형
반응형