C언어에서 포인터, 배열, 포인터 연산, 동적메모리 할당

|
  • 포인터(= 포인터 변수)

    포인터는 메모리 주소를 값으로 가지는 변수.

    다음과 같이 선언한다.

      type-name * variable-name;
      ex) int *aInt;
    
  • 연산자 & (주소연산자)

    연산자 &는 변수로부터 그 변수의 주소를 추출하는 연산자이다. ```c

    int c = 12; int * p; p = &c;




- 연산자 * (참조연산자)

    연산자 *는 포인터가 가르키는 주소에 저장된 값을 반환한다.
```c

    int x =1, y=2;
    int * ip; // ip는 int형 포인터 변수임을 선언.
    ip = &x; // ip에 x의 주소값을 할당

    y = *ip; // y에 ip의 주소값이 가진 실제 값을 할당 ( y = x = 1 )
    *ip = 0; // ip의 주소값이 가진 실제 값에 0을 할당 ( x = 0 )

  • 포인터와 배열
    • 포인터와 배열은 매우 긴밀히 연관되어 있다.
    • 예를 들어 다음과 같이 선언된 배열 a가 있다고 하자.

    int a[10]; // 배열의 이름은 배열의 시작 주소를 저장하는 포인트 변수다.(단 그 값을 변경할 수 없다)

  • 포인터 arithmetic

    int a[10];

*a와 a[0]은 동일한 의미이다.
또한 a[1]은 *(a+1)과 동일하고, a[i]는 *(a+i)와 동일하다.
만약 a[0]의 주소값 = 1000 이라면
a[1]의 주소값 = 1004.
  • 동적 메모리 할당

    변수를 선언하는 대신 프로그램의 요청으로 메모리를 할당할 수 있다. 이 것을 동적 메모리 할당이라고 부른다. malloc 함수를 호출하여 동적 메모리 할당을 요청하면 요구하는 크기의 메모리를 할당하고 그 시작 주소를 반환한다.

      int *p = (int *)malloc(40); 
      p[0] = 10; // 포인터변수를 배열처럼 사용가능하다.
    

    그렇다면 int array[4] 와 int *array 차이점은 무엇일까?

    int array[4] : 처음부터 배열로 선언 시 재할당이 불가능하다.