[C언어] 포인터 _ 1차원 배열 완벽 정리
C언어 2강. 1차원 배열
핵심 : 배열의 이름은 그 배열의 시작 주소이다.
그러므로 포인터 p는 배열의 시작주소 arr을 값으로 담을 수 있다.
int arr[7] = {1,2,3,4,5,6,7}; //배열의 이름 arr은 포인터이다.
int *p; //포인터 p 선언
p = arr; //p[0] == arr[0]
printf("p[0] : %d, arr[0] : %d", p[0], arr[0]);
printf("p의 주소 : %ul, arr의 주소 : %ul", p, arr);
결과 :
p[0] : 1, arr[0] : 1
p의 주소 : 13927135812l, arr의 주소 : 13927135812l
간단한 그림으로 표현하자면 다음과 같다.
① 배열 선언 arr[7] = {1,2,3,4,5,6,7};
1 | 2 | 3 | 4 | 5 | 6 | 7 |
arr[0] arr[1] arr[2] arr[3] arr[4] arr[5] arr[6]
*(arr+0) *(arr+1) *(arr+2) *(arr+3) *(arr+4) *(arr+5) *(arr+6)
for(int i = 0; i < 7; ++i){
printf("%d, %d", arr[i], *(arr+i));
}
결과 :
1, 1
2, 2
3, 3
4, 4
5, 5
6, 6
7, 7
JAVA나 Javascript로 배열을 배워서 arr[0]은 익숙해도 *(arr+0)이 이해하기 어렵다면 다음과 같이 풀어서 생각해보면 좋다.
*(arr+0) : arr+0이 가리키는(*) 값
② 포인터 p선언 int *p;
p
p라는 포인터 변수의 공간이 만들어졌다.
③ 포인터 p에 배열 arr의 첫 번째 값을 가리키는 주소 대입 p = arr; 또는 p = arr+0;
&arr |
p
포인터는 주소를 저장하는 변수이고, 포인터 p에 arr변수의 첫 번째 값을 저장했다면 다음과 같은 일이 벌어진다.
1 | 2 | 3 | 4 | 5 | 6 | 7 |
arr[0] arr[1] arr[2] arr[3] arr[4] arr[5] arr[6]
p[0] p[1] p[2] p[3] p[4] p[5] p[6]
*(arr+0) *(arr+1) *(arr+2) *(arr+3) *(arr+4) *(arr+5) *(arr+6)
*(p+0) *(p+1) *(p+2) *(p+3) *(p+4) *(p+5) *(p+6)
즉,
arr[0] == p[0] == *(arr) == *(arr+0) == *(p+0) == 1
arr[1] == p[1] == *(arr+1) == *(p+1) == 2
arr[2] == p[2] == *(arr+2) == *(p+2) == 3