본문 바로가기

C

[C언어] 배열(Array)과 포인터(Pointer)

반응형

배열을 포인터로 가리킬 때, 포인터는 배열이 시작되는 주솟값을 가리킨다.

 

x[0] = *p;        // 배열 x가 시작하는 x[0]에 포인터 p를 저장한다.
                  // x[0]에는 포인터 p가 가리키는 값이 저장된다.

&x[0] == p == x   // 임의의 배열에 대한 주솟값은 배열이 시작되는 주소이다.
                  // 즉, 배열 x의 주소값은 배열이 시작되는 x[0] 값이 위치한 주소이며,
                  // 배열 x를 출력하면 주솟값이 출력된다.

x[1] == *(p + 1)  // x[1]을 나타내기 위해서는 포인터 p의 주솟값에서 +1을 해주어야 한다.
                  // 이때 'p + 1'은 포인터 변수의 데이터 타입에 따라 크기가 다르다.

 

#include<stdio.h>
#define SIZE 5

int main(){

   int x[SIZE] = {10, 20, 30, 40, 50};
   int *p;   // 정수형 포인터변수 선언

   p = x;   // x는 배열이므로 배열이 시작하는 주솟값을 가지고 있다. 즉, 배열명은 배열의 시작주소를 뜻한다.
            // p = &x[0]과 동일한 의미를 가진다.

   printf("x : %d\n", x);
   printf("p : %d\n", p);

   printf("\n--------------------------\n");

   printf("x[0] : %d\n", x[0]);
   printf("*p : %d\n", *p);

   printf("\n--------------------------\n");

   printf("x[1] : %d\n", x[1]);
   printf("*(p + 1) : %d\n", *(p + 1));

   printf("\n--------------------------\n");

   printf("*(p + 1) : %d\n", *(p + 1));
   printf("*p + 1 : %d\n", *p + 1);   // *p는 산술연산자(+)보다 높기 때문에, +보다 먼저 계산된다.
                                      // 따라서 '*p == 10', 그리고 '+ 1'하여 '11'이 출력된다.

   printf("\n--------------------------\n");

   for(int i = 0; i < 5; i++){
      printf("x[%d] : %d\n", i, x[i]);
      printf("*(p + %d) : %d\n", i, *(p + i));
   }

   printf("\n--------------------------\n");

   printf("*p++\n");
   for(int i = 0; i < 5; i++)
      printf("%d\n", *p++);

   return 0;
}

 


#include<stdio.h>

int main(){
   int arr[] = {1, 2, 3};
   int *p = arr;

   printf("배열의 이름 : %p\n", arr);   // %p는 주소를 출력한다.
   printf("arr[0] = %p\n", &arr[0]);
   printf("arr[1] = %p\n", &arr[1]);
   printf("arr[2] = %p\n\n", &arr[2]);

   printf("arr[0] = %p\n", p);
   printf("arr[1] = %p\n", p + 1);
   printf("arr[2] = %p\n\n", p + 2);

   printf("arr[0] = %d\n", &arr[0]);   // 배열에 저장된 값을 주솟값 형식(%p)으로 출력한다.
   printf("arr[1] = %d\n", &arr[1]);
   printf("arr[2] = %d\n\n", &arr[2]);

   printf("arr[0] = %p\n", arr[0]);
   printf("arr[1] = %p\n", arr[1]);
   printf("arr[2] = %p\n\n", arr[2]);

   printf("%d : %d : %d : %d\n", arr[0], p[0], *p, *arr);
   printf("%d : %d : %d : %d\n", arr[1], p[1], *(p + 1), *(arr + 1));
   printf("%d : %d : %d : %d\n", arr[2], p[2], *(p + 2), *(arr + 2));

   return 0;
}

 


포인터는 배열처럼 사용이 가능하다.

 

#include<stdio.h>

int main(){

   int arr[5] = {1, 2, 3, 4, 5};
   int *p = arr;   // 배열의 이름은 배열의 시작주소를 나타낸다. == &arr[0]

   for(int i = 0; i < 5; i++)
      printf("p[%d] = %d\n", i, p[i]);

   return 0;
}

 

반응형