프로그래밍 언어/C언어

C언어 포인터와 배열에대해 알아보기입니다.

원원 2017. 11. 1. 22:21

안녕하세요. 오늘은 배열과 포인터의 관계에 대해 알아보겠습니다.

배열과 포인터는 밀접한 관련이 있습니다. 왜냐하면 배열의 이름 = 주소입니다.




배열의 이름 = 배열의 첫번째 주소

위의 그림을보면 int형 배열을 선언했습니다. array1[0]의 주소는 1이고 int형이므로 주소가 4씩 증가하게 됩니다.

이때 array1 = &array1[0] = &array1이 됩니다.

array1 = 배열의 이름이 배열의 첫번째 주소

&array1[0] = 배열의 첫번째 주소

&array1 = array1배열의 주소


그러나 배열의 크기는 다릅니다. array1의 크기는 20이고 array1은 int형이므로 4입니다.

그러므로 array1+1 = 5 , &array1[0]+1 = 5, &array1+1 = 21이 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
int main(void)
{
    int array1[5= { 1234};
 
    printf("array1의 이름  : %d \n", array1);
    printf("array1[0]의 주소 : %d \n"&array1[0]);
    printf("array1의 주소 : %d \n"&array1);
    printf("array1의 크기 : %d \n"sizeof(array1));
    printf("----------------------------\n");
    printf("array1의 이름 +1 : %d \n", array1 + 1);
    printf("array1[0]의 주소+1 : %d \n"&array1[0]+1);
    printf("array1의 주소 +1 : %d \n"&array1 + 1);
    printf("----------------------------\n");
 
 
}
cs

나중에 문자열을 다룰 때 배열의 이름을 사용해서 참/거짓을 따지면 안됩니다.(배열의 이름은 주소값이기 때문)



배열과 포인터의 관계



배열의 이름이 포인터이므로 배열과 포인터의 관계를 쉽게 알 수 있습니다.


int형 포인터를 선언해서 array1배열을 가리키는 모습입니다.

array1_p은 포인터이므로 array1의 주소를 담고 있고, 자기의 주소는 100입니다.

이때 array1_p의 이름 = 배열의 첫번째 주소 라고 착각하면 안됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int main(void)
{
    int array1[5= { 1234};
    int *array1_p = array1;
    printf("array1의   주소 : %d \n", array1);
    printf("array1_p의 이름 : %d \n", array1_p);
    printf("array1_p의 주소 : %d \n"&array1_p);
    printf("array1의 크기 : %d \n"sizeof(array1_p));
    printf("----------------------------\n");
    printf("array1_p의 이름 +1 : %d \n", array1_p + 1);
    printf("array1_p의 주소 +1 : %d \n"&array1_p + 1);
}
cs





또한 포인터를 배열처럼 사용 할 수도 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main(void)
{
    int array1[5= { 1234};
    int *array1_p = array1;
    printf("array1_p[0] : %d \n", array1_p[0]);
    printf("array1_p[1] : %d \n", array1_p[1]);
    printf("array1_p[2] : %d \n", array1_p[2]);
    printf("array1_p[3] : %d \n", array1_p[3]);
    printf("array1_p[4] : %d \n", array1_p[4]);
}
cs




arr[i] == *(arr+i)

C언어 책을보면 이런 공식이 있습니다.




arr[0]의 값은 1입니다.

arr의 주소는 1입니다. arr이 가리키키는 값(*arr)은 1 입니다.


arr[1]의 값은 2 입니다.

arr+1의 주소는 5 입니다. arr+1이 가리키는 값*(arr+1)은 2 입니다.