C언어 포인터와 배열의 관계

프로그래밍/C 2019.03.19 댓글 Plorence
배열의 이름은 포인터입니다. 단 그값을 바꿀 수 없는 '상수 형태의 포인터'입니다.
들어가기 전에,서식문자 %p 는 주소값의 출력에 사용되는 서식문자입니다.


포인터와 배열의 관계

배열 원소에 접근할때 내부에서 포인터를 사용합니다.
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main (void){
    int arr[3= {0,1,2};
    printf("%p \n",arr);
    printf("%p \n",&arr[0]);
    printf("%p \n",&arr[1]);
    printf("%p \n",&arr[2]);
    
    return 0;
}
출력결과는 다음과 같습니다.
1
2
3
4
000000000062FE40
000000000062FE40
000000000062FE44
000000000062FE48
(해당 결과는 PC마다 다름. 참고용임)
int는 4바이트라서 int형 배열요소간 주소 값의 차는 4바이트입니다.

위에 사진은 할당된 배열의 구조입니다.

배열의 첫 번째 바이트의 주소 값이 0x63FE40인데,배열의이름을 출력한 결과도 이와 같습니다.
배열의 이름은 대입연산자의 피연산자가 될 수 없으므로 (값의 저장 불가능) 다음의 결론을 내립니다. (arr = arr[0])
배열의 이름은 배열의 시작 주소값을 의미하며, 그 형태는 값의 저장이 불가능한 상수인겁니다.
포인터변수와 배열의이름을 비교
비교조건/비교대상
포인터 변수
배열의 이름
이름이 존재하는가?
존재한다
존재한다
무엇을 나타내거나 저장하는가?
메모리의 주소값
메모리의 주소값
지시하는 주소값의 변경이 가능한가?
가능하다
불가능하다.
즉 배열의 이름은 상수형태의 포인터
배열의이름을 포인터 상수 라고 부르기도 합니다.
포인터변수는 가리키는변수를 변경이 가능하지만,배열의이름 (포인터상수)는 가리키는것이 arr[0]으로 고정입니다.

즉 포인터 변수와 배열의이름의 차이점은 변수,상수라는것입니다.





댓글