티스토리 뷰
1. Visual Studio를 이용한 C 프로그래밍
- 패스
2. C의 단순 자료형 (컴파일러마다 다르다)
자료형 | 크기 | 수의 범위 |
---|---|---|
short | 2바이트 | -32,768 ~ +32,767 |
int | 4바이트 | -2,147,483,648 ~ +2,147,483,647 |
long | 4바이트 | -2,147,483,648 ~ +2,147,483,647 |
unsigned short | 2바이트 | 0 ~ +65,535 |
unsigned int | 4바이트 | 0 ~ +4,294,967,295 |
unsigned long | 4바이트 | 0 ~ +4,294,967,295 |
float | 4바이트 | -3.4E-38 ~ +3.4E+38 |
double | 8바이트 | -1.7E-308 ~ 1.7E+308 |
char | 1바이트 | -128 ~ +127 |
unsigned char | 1바이트 | 0 ~ +255 |
3. 배열
- 같은 자료형의 데이터를 메모리상에 연속적으로 저장하는 자료형
3.1 1차원 배열
- 자료형 변수이름 [원소개수]
- ex) int key[3];
3.2 1차원 배열 초기화와 값 설정
-
배열의 초기화
- 방법 1) int key[3] = { 3, 5, 7};
- 방법 2) int key[] = {3, 5, 7};
- 방법 3) int key[3] = {0, }; key[0] = 3; key[1] = 5; key[2] = 7;
-
문자 배열의 초기화
- 마지막에는 반드시 특수 문자 '\0' (NULL, 널 문자)을 할당해야 한다.
- 실제 저장해야 되는 문자 개수보다 반드시 1바이트 더 크게 메모리를 할당해야 한다.
3.3 다차원 배열
-
배열의 원소가 배열 자료형인 배열을 말한다. (행렬과 같은 형태)
-
2차원 배열
- int values[2][3] = { {3, 5, 7}, {4, 6, 8} }
4 구조체
- 서로 다른 자료형의 데이터를 하나의 그룹으로 묶은 자료형
4.1 구조체 선언
- 구조체 이름 + 구조체의 속성들
struct student {
char name[20 + 1];
int year;
float score;
}
Struct | (구조체의 이름) | { |
---|---|---|
(1번째 속성의 자료형) | (1번째 속성의 이름) | ; |
(2번째 속성의 자료형) | (2번째 속성의 이름) | ; |
··· | ··· | , |
(n번째 속성의 자료형) | (n번째 속성의 이름) | }; |
4.2 구조체의 초기화와 값 설정
- 초기화 하는 방법
구조체의 초기화 | 값 설정 |
---|---|
struct student student_lee = {"lee", 2008, 95.4} | struct student student_lee = {0}; |
strcpy(student_lee.name, "lee" | |
student_lee.year = 2008; | |
student_lee.score = 95.4 |
- 대입 연산자를 통해 구조체 변수 사이에 다음과 같이 복사 할 수 있다.
struct student lee_src = { "lee", 2008, 95.4 };
struct student lee_dest = {0, };
lee_dest = lee_src;
- typedef 연산자를 사용하여 type을 정의
typedef struct student_type {
char name[20 + 1];
int year;
float score;
} student;
student lee_src = { "lee", 2008, 95.4 };
5. 포인터
- 포인터 변수는 메모리 주소 값을 저장하는 변수
- 다른 변수들은 메모리에 특정 값을 저장하는데 비해 포인터 변수는 다른 변수들의 물리적 주소를 저장한다
5.1 포인터 선언 및 연산
- 포인터 선언
// 방법 1
int int_value = 100;
int *ptr_int = &int_value;
// 방법 2
int *ptr_int = NULL;
int int_value = 100;
ptr_int = &int_value;
- 주소 연산자 &
- 변수의 주소 값을 얻을 때 사용
- 문법
// 포인트 변수 = &변수;
float float_value = 5.23f;
float *ptr_float = NULL;
ptr_float = &float_value;
- 참조 연산자 *
- 포인터 변수에 저장된 주소를 이용하여 해당 주소에 있는 값을 나타낸다.
- 문법
// *포인터 변수 = 값;
char char_value_A = 'A';
char *ptr_char = &char_value_A;
*ptr_char = 'X';
// *포인터 변수 = 변수;
char char_value_A = 'A';
char char_value_B = 'B';
char *ptr_char = &char_value_A;
*ptr_char = char_value_B;
// 변수 = *포인터 변수
char char_value_A;
char char_value_B;
char *ptr_char = NULL;
char_value_A = 'A';
char_value_B = 'B';
ptr_char = &char_value_A;
char_value_B = *ptr_char;
5.3 포인터를 이용한 동적 메모리 할당
-
동적 메모리 할당
- 프로그램 실행 도중 동적으로 메모리를 할당하는 것
- '동적'이라는 의미는 할당될 메모리의 크기가 컴파일할 때 미리 정해져 있지 않았다는 의미
- 즉, 프로그램이 실행되는 도중에 임의의 크기로 메모리(배열 혹은 구조체)를 할당할 수 있다는 점
- 장점
- 동적으로 필요한 양만큼의 메모리를 할당할 수 있다
- 단점
- 소스 코드가 복잡해지고 사용 방법이 정적 메모리 할당에 비해 다소 어렵다
- 메모리를 다 사용한 다음 반드시 메모리를 해제시켜 주어야 한다
-
정적 메모리 할당
- 프로그램이 실행되기 전에 할당해야 할 메모리 크기가 미리 정해진 경우
- 장점
- 소스 코드가 단순하여 간단하게 사용할 수 있다
- 단점
- 대부분 여유를 가지도록 메모리를 할당하여 메모리 낭비가 발생하기 쉽다
// 정적 메모리 할당
int int_array\[100\] = {0, };
// 정적 메모리 할당 오류 (컴파일 오류)
int size = 100; // 상수 값이 아님
int int_array[size] = {0, };
// 동적 메모리 할당
int *ptr_int = NULL;
int size = 100;
size = 200;
ptr_int = (int *)malloc(sizeof(int) * size);
#include <stdlib.h>
void *malloc(int size);
- malloc 메서드
- 입력 파라미터인 size 바이트 만큼 메모리를 할당한다. 그리고 할당된 메모리 블록의 시작 주소를 반환한다.
- 메모리 할당이 불간으한 경우 NULL을 반환하며 이 때 NULL로 반환된 주소로 다른 연산을 수행하면 프로그램이 죽어버리기 때문에 함수 malloc() 호출 후에는 반드시 NULL이 아닌지 검사해야 한다
- 함수 malloc()를 호출하여 메모리를 할당받은 쪽에서는 메모리 사용이 끝난 다음 함수 free()를 호출하여 반드시 메모리를 해제시켜야 한다. 사용이 끝난 메모리가 해제되지 않는 것을 메모리 누수(leek)가 발생하였다고 하며, 프로그램이 차지하는 메모리가 점점 커지게 되어 프로그램 성능에 좋지 않은 영향을 미친다.
ptr_int = (int *)malloc(sizeof(int) * size);
if (ptr_int != NULL) {
// do-something
} else {
// ERROR !!
}
#include <stdlib.h>
void free(void *ptr);
- free 메서드
- 입력 파라미터인 포인터 변수에 의해 전달받은 메모리를 해제한다.
- 단, 입력 파라미터로 NULL 또는 다른 쓰레기(garbage) 주소가 전달되는 경우 프로그램이 죽어버릴 수 있기 때문에 메모리 해제 시에 정확한 포인터가 파라미터로 전달되도록 주의해야 한다
if (ptr_int != NULL) {
free(ptr_int);
}
#include <string.h>
void *memset(void *ptr_start, int value, size_t count);
- memset 메서드
- 입력 파라미터인 전달 받은 포인터 변수 ptr_start가 가리키는 메모리 영역을 시작으로, 모두 count 크기만큼을 값 value로 설정한다
5.4 포인터의 포인터
- 포인터 변수를 가리키는 포인터 변수
- 다른 변수의 메모리 주소를 저장하는 포인터 변수의 주소를 가리킨다
int int_value = 500;
int *ptr_int = &int_value;
int **pptr_int = &ptr_int;
5.5 포인터와 배열
int row = 3;
int col = 4;
int **pptr_int_array = NULL;
pptr_int_array = (int **) malloc(sizeof(int *) * row);
for (int i = 0; i < row; i++) {
pptr_int_array[i] = (int *) malloc(sizeof(int *) * col;
memset(pptr_int_array\[i\], 0, sizeof(int) * col);
}
5.6 기타
- 구조체에 대해서토 포인터 변수를 적용 할 수 있다
struct student student_lee;
struct student *ptr_student = NULL;
ptr_student = &student_lee;
strcpy(ptr_student -> name, "test");
ptr_student -> score = 80.1f;
ptr_student -> year = 2005;
strcpy((*ptr_student).name, "test");
(*ptr_student).score = 80.1f;
(*ptr_student).year = 2005;
// 점 연산자(.)의 우선순위가 참조 연산자(*)보다 높다
'CS > 자료구조' 카테고리의 다른 글
[열혈강의] 01. 자료구조의 시작 (0) | 2019.07.15 |
---|
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- repository
- 열혈강의
- 2019 카카오 개발자 겨울 인턴십
- 구현
- DP
- spring boot 2.3.1
- 백준
- 그리디
- 그래프
- 깃
- dfs
- Python
- 저장소
- binary search
- bfs
- 코틀린
- Idempotent
- 이것이 코딩테스트다
- Algorithm
- 단계별로 문제풀이
- Summer/Winter Coding(~2018)
- 자료구조
- Algorihtm
- 알고리즘
- git
- programmers
- OS
- BOJ
- 2020 카카오 인턴십
- 정렬
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함