일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- C
- 프로세스
- pytorch
- APOLLO
- 해시테이블
- 프론트엔드
- 배열
- 프로그래머스
- vue3
- 연결리스트
- 알고리즘
- RxJS
- GraphQL
- 자바스크립트
- cors
- 릿코드
- 코딩테스트
- alexnet
- 웹팩
- 연결 리스트
- 이진탐색
- 큐
- 포인터
- Machine Learning
- 브라우저
- 타입스크립트
- RT scheduling
- 자료구조
- 컨테이너
- 스택
- Today
- Total
목록포인터 (8)
프린세스 다이어리
1. 연결 리스트의 장점 일반적으로 배열을 사용하여 데이터를 순차적으로 저장하고, 나열할 수 있다. 하지만 배열을 사용하는 경우, 메모리 공간이 불필요하게 낭비될 수 있다. 연결 리스트를 활용하여 이를 개선할 수 있다. 다음은 연결 리스트가 아닌, 일반적인 배열을 사용하여 특정 원소를 배열의 첫자리에 추가하는 소스다. #include #define INF 10000 int arr[INF]; int count = 0; void addBack(int data) { arr[count] = data; count++; } void addFirst(int data) { for (int i = count; i >= 1; i--) { arr[i] = arr[i - 1]; } arr[0] = data; count++; ..
1. 가비지가 무엇이고, 왜 가비지 컬렉터가 필요한가요? 가비지 콜렉터(Garbage Collector)는 애플리케이션이 실행될 때, 메모리에 저장은 되어 있지만 어디에서도 사용되지 않는 변수를 알아서 메모리에서 치워 주는 관리 방법이다. 제대로 이해하기 위해서는 먼저 가비지, 즉 쓰레기 메모리가 무엇이고 왜 생기는지를 알아야 한다. 이전에 업로드한 동적 메모리 할당의 개념을 정리한 글과 내용이 일부 중복되어 있다. 일반적으로 C에서 배열을 선언할 때, 사전에 적절한 크기만큼 할당해 준다. int a[20] = "hello world"; 그런데 항상 사전에 메모리를 할당해주는 게 아니라, 프로그램 실행 도중에 필요시 메모리를 할당해야 할 때가 있다. C에서는 malloc() 함수를 사용해, 원하는 만큼의..
1. 파일 입출력의 필요성 프로그램이 꺼진 이후에도 데이터를 저장하기 위해서는 파일 입출력이 필요하다. 예를 들어, 게임을 껐다 켰는데 다시 캐릭터를 처음부터 만들어야 한다면 시간 버린 느낌이 들 것이다. 즉, 어떠한 데이터를 프로그램 안에서만 사용하는 게 아니라, 프로그램의 외부에 일시적으로 저장을 해 놨다가 프로그램을 다시 실행시킬 때 다시 불러올 수 있도록 하는 역할을 한다. 흔히 SSD, RAM, CPU는 일반적으로 컴퓨터에 들어가는 부품이다. 이 중 파일이 실질적으로 저장이 되는 위치를 고르라면, 바로 SSD다. 컴퓨터 아키텍처마다 조금씩 차이는 있겠지만 램과 CPU는 휘발성이 있다는 특징이 있다. 그래서 바탕화면 등에 있는 파일은 SSD와 같은 보조기억장치에 저장되고, 그것을 더블클릭해서 실행..
1. 구조체란 여러 개의 변수를 묶어서 하나의 객체를 표현하고자 할 때 구조체를 사용할 수 있다. 배열과 달리, 서로 다른 특성을 같이 묶어서 객체의 성격을 표현하는 것이다. 캐릭터, 몬스터, 좌표 등 다양한 객체를 모두 정의할 수 있다. 구조체는 다음과 같이 선언할 수 있다. struct 구조체명 { 자료형1 변수명1; 자료형2 변수명2; } 2. 구조체의 정의 방법 한 명의 학생에 대한 정보를 담고 있는 구조체를 만들어 본다면 다음과 같다. #include struct Student { char studentId[10]; char name[10]; int grade; char major[100]; }; 위와 같이 프로그램에서 요구하는 특성에 맞게 객체의 특성을 정의할 수 있다. int main(voi..
1. 함수 포인터란 함수 또한 다른 자료형처럼 포인터 주소를 가진다. 배열의 이름이 메모리 주소를 반환하는 것처럼, 함수의 이름도 내부적으로 컴퓨터 메모리에 기록이 된다. 함수 포인터는 특정한 함수의 반환 자료형을 지정하는 방식으로 선언할 수 있다. 함수 포인터를 하나 만들어서, 특정한 함수 자체를 가리키도록 할 수 있다. 반환 자료형과 매개변수는 해당 함수가 가지고 있던 것으로 가져와야 한다. 반환 자료형(*함수 포인터 이름)(매개변수) = 함수명; #include void func() { printf("yess"); } int main(void) { printf("%p \n", func); } 0x100417f40 이렇게 간단한 함수를 만들고, 함수의 이름을 넣어서 출력하도록 만들면 반환되는 값으로 ..
1. 동적 메모리 할당의 개념과, 함수 malloc() 일반적으로는 C에서 배열을 선언할 때 사전에 적절한 크기만큼 할당해주어야 한다. int a[20] = "hello world"; 그런데 항상 사전에 메모리를 할당하는 게 아니라, 프로그램 실행 도중에 필요할 때 메모리를 할당해야 할 때가 있을 것이다. 그 경우에 동적 메모리 할당을 사용해야 한다. C에서는 malloc() 함수를 이용해 원하는 만큼의 메모리 공간을 확보할 수 있다. 포인터 = malloc(할당할 바이트 크기); Memory allocation의 약자인 malloc 함수는 메모리 할당에 성공하면 주소를 반환하고, 그렇지 않으면 null을 반환한다. 현재 컴퓨터의 메인 메모리, 즉 램을 확인한 다음, 거기서 현재 할당하고자 하는 메모리를..
1. 문자열의 개념 앞서 살펴보았듯 C에서는 문자열이 따로 없고 문자의 배열로 이를 표현한다. 특이점은 문자열은 컴퓨터 메모리 구조 상 마지막에 널(null) 값을 포함한다는 점이다. 어떠한 값도 의미 있지 않다는 의미다. 0 1 2 3 4 5 6 7 8 9 H I E U N J I N ₩0 (\0) null값이 들어가는 이유는 문자열의 마지막임을 알리기 위해서다. 그래서 printf() 함수를 실행하면, 컴퓨터는 내부적으로 null값을 만날 때까지 출력하는 것이다. 2. 문자열 리터럴과 포인터 문자열 형태로 포인터를 사용할 수 있다. 배열 형태가 아닌, 포인터 자체에 문자열을 마치 상수처럼 읽기 전용으로 넣는 것이다. 이 때, 큰따옴표 안에 문자열을 넣게 되는데 이걸 문자열 리터럴 이라고 하고, 컴파일..
1. 포인터의 개념 이전까지 공부한 변수는 그 자체로 자신의 자료형에 맞는 값을 저장한다. int, double, char 등이 그 예시다. 포인터는 메모리의 주소 값 자체를 저장한다. int형 변수를 만들었다고 하면, 컴퓨터 어딘가에 int가 저장된 공간이 있을 것이고, 그것의 메모리 주소를 가리키고 있는 포인터도 있다. 포인터는 메모리 주소의 값을 가지기 때문에 컴퓨터 메모리에 바로 접근할 수 있다. int a = 5; int 5 값을 가지는 a 변수가 있고 이것의 메모리 주소는 0xAFB03912 라고 가정해 보자. int *b = &a; 포인터는 int *b = &a; 처럼 선언할 때 * 연산자를 사용하여 포인터 변수임을 표현한다. 이 의미는 포인터 변수 b가 a의 메모리 주소를 가리키고 있다는 ..