Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 지도학습
- 전류
- 초음파 회로
- 딥러닝
- c++
- 고민이 많다...
- 열심히 하자
- 머신러닝
- 앰보싱
- orcad
- 포인터란
- 동적할당
- 포인터
- 포인터 쓰는 이유
- 머신러닝 기초
- 사진수정
- ultrasonic
- 거리 측정 회로
- 2차배열
- 비지도학습
- 주저리 주저리
- 첫 수업에서 배운 내용
- 2차 배열 코드
- 화소점
- 신경망
- 이미지 처리
- C언어
- 코딩
- 전기의 기본 성질
- svm
Archives
- Today
- Total
매일공부
포인터_포인터와 배열 본문
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를 이용한 간단한 포인터 이용 코드이다. 하나하나 뜯어보자
- int* p > 포인터 변수 선언(*을 이용하여 선언)
- p=(int*)malloc(SIZE*sizeof(int));
- 성공 >> 메모리 주소 반환 || 실패 >>NULL반환
-
- malloc(sizeof(int)) : int변수의 크기인 4바이트 힙영역에서 할당한다. 힙공간에 있는 4바이트를 이제 마음대로 활용할 수 있다.
- (int*): malloc 함수를 통해 메모리 할당에 성공시 할당한 메모리 블록 가리키는 포인터를 리턴한다. (주소 리턴). 해당 포인터의 타입은 언제나 void*이기에 사용자가 원하는 타입으로 캐스팅 해줘야한다. >> 현재 p의 형식을 int 로 했기 때문에 int* 를 반환해야한다.
-
for (int i = 0; i < SIZE; i++) { p[i] = value++; }
- 포인터 p에 할당되는 값을 넣는다
- 여기서 왜 포인터 변수였는데 배열이 나왔지 하는 의문을 분명 가질 것이다.
- 배열 또한 일종의 포인터로 우리가 일반적으로 사용하는 *p=p[i] 와동일한 개념이다.
- 예시로 int p[i]; 와 같은 배열을 선언하고 printf(p); 를하면 p의 값이 아닌 주소를 알 수 있을 것이다.
- 포인터 p에 할당되는 값을 넣는다
- 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 |