매일공부

포인터_포인터와 배열 본문

임베디드 개발자/코딩

포인터_포인터와 배열

임베디드초보자 2022. 1. 25. 08:52

1. 포인터

 c언어가 고급 언어임에도 low 레벨 언어의 특성을 지닌 이유이다. 포인터를 통해 메모리에 직접 접근하며 성능을 향상 시키고 적정한 메모리를 할당함으로써 최소한의 메모리를 사용할 수 있다. 이번 시간에는 포인터를 통한 배열에 대하여 알아보자

2. 메모리 설명

  • 간단한 메모리 설명
    • 포인터를 이해하기 위해서는 간단한 메모리에 대한 이야기를 하고가야할 것 같다.
  • 1. 코드 영역
    • 실행할 프로그램의 코드가 저장되는 영역
    • 텍스트 영역이라고도 부른다,
    • cpu는 코드 영역에서 저장된 명령어를 하나씩 가져가 처리한다.
  • 2. 데이터 영역
    • 전역 변수와 정적 변수가 저장되는 영역
    • 데이터 영역은 프로그램 시작과 함께 할당된 후 프로그램 종료시 소멸
  • 3. 스택(stack) 영역
    • 함수의 호출과 함께 할당, 함수의 호출 완료시 소멸
    • 푸시 동작으로 데이터를 저장/ 팝 동작으로 데이터를 인출
    • 스택은 후입선출 방식에 따라 동작> 가장늦게 저장된 데이터가 가장 먼저 인출 된다.
    • 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
  • 4.힙(heap)영역
    • 사용자가 직접 관리할 수 있는 메모리 영역
    • 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
    • 메모리의 낮은 주소에서 높은 주소 방향으로 할당된다.

3. 포인터와 배열

  • 왜 사용할까 ?
    •  C언어 배열을 사용할 때 고질적인 문제는 배열의 행과 열의 개수를 const 형인 상수를 항상 대입하여야 한다는 것이었다. 내가 오늘 기분이 안좋아 배열 갯수를 늘리고 싶을 수도 있고 1개만 적고 싶을 수도 있는데 대체 왜 그렇게 해야하는걸까? 그러면 배열을 원할 때마다 추가하고 삭제해야할까 ?
    • 정답은 당연히 당연히 아니다. 앞부분에 설명했던 힙영역을 사용한다면 우리도 동적으로 메모리를 할당하고 원하는 만큼 배열을 사용할 수 있다.
  • 어떻게 사용할까
    • int main() {
          //동적 배열 --> 사용자가 입력하는 크기만큼 ,,,
          int SIZE;
          printf("몇 개 필요?");
          scanf("%d",&SIZE);
          
          int* p;
          p=(int*) malloc(SIZE*sizeof(int));//동적 할당 위한 함수
          int value = 200;
          for (int i = 0; i < SIZE; i++)
          {
              p[i] = value++;
      
      
          }
      
          free(p);
          printf("프로그램 끝!");
          }
  • C를 이용한 간단한 포인터 이용 코드이다. 하나하나 뜯어보자
    1. int* p > 포인터 변수 선언(*을 이용하여 선언)
    2. p=(int*)malloc(SIZE*sizeof(int));
      1. 성공 >> 메모리 주소 반환 || 실패 >>NULL반환
      2. malloc 함수 설명
        1. malloc(sizeof(int)) : int변수의 크기인 4바이트 힙영역에서 할당한다. 힙공간에 있는 4바이트를 이제 마음대로 활용할 수 있다.
        2. (int*): malloc 함수를 통해 메모리 할당에 성공시 할당한 메모리 블록 가리키는 포인터를 리턴한다. (주소 리턴). 해당 포인터의 타입은 언제나 void*이기에 사용자가 원하는 타입으로 캐스팅 해줘야한다. >> 현재 p의 형식을 int 로 했기 때문에 int* 를 반환해야한다.
      3. for (int i = 0; i < SIZE; i++)
            {
                p[i] = value++;
            }
        •  포인터 p에 할당되는 값을 넣는다 
          • 여기서 왜 포인터 변수였는데 배열이 나왔지 하는 의문을 분명 가질 것이다.
          • 배열 또한 일종의 포인터로 우리가 일반적으로 사용하는 *p=p[i] 와동일한 개념이다.
          • 예시로  int p[i]; 와 같은 배열을 선언하고 printf(p); 를하면 p의 값이 아닌 주소를 알 수 있을 것이다.
      4. free(p)
        • 어떻게 보면 가장 중요한 부분중 하나이다.
        • malloc 함수를 통해 4바이트의 메모리를 할당 받았다.
        • 이러한 할당된 메모리는 우리가 이를 해제할 때까지 계속 차있다고 보면된다.
        • 물론 요즘에 ram이 커지긴했지만 이러한 메모리를 필요 없이 쓰고 있는건 상당히 좋지 않다.
        • 우리가 프로그램을 돌리고 처음에는 되는데 나중에는 되지 않는 이유는 상당수 이러한 할당된 메모리를 반환하지 않음에 있다.
        • 항상항상 사용 후에는 메모리를 반환하자

이렇게 간단한 동적 메모리 할당에 대하여 알아 보았다. 포인터는 c의 꽃이다. 하지만 포인터만 꼭 열심히 할 필요는 없다. 우리가 현업에서 포인터를 통해 일을할건 아니니 ... 꼭 알아두지만 너무 몰두하고 너무 어려워해서 c를 포기하지는 말자 중요하지만 이것만 알아야되는건 아니니 ... 다음번에는 포인터를 활용한 2차 배열에 대해 알아보겠다.

'임베디드 개발자 > 코딩' 카테고리의 다른 글

MFC 사용하기  (0) 2022.02.07
C언어 기반 영상처리 프로젝트  (1) 2022.02.05
포인터/배열  (0) 2022.01.19
이미지 처리  (0) 2022.01.19
1월 18일 간단한 코드 연습과 서식/연산자  (0) 2022.01.19