일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 스프링
- 카카오 코테
- @Component
- 구조체배열
- TypeORM
- OpenCV
- spring boot
- 알고리즘
- 코테
- 코딩테스트
- @Autowired
- 프로그래머스
- 컴포넌트스캔
- 시스템호출
- nestjs auth
- Spring
- python
- 파이썬
- 가상면접사례로배우는대규모시스템설계기초
- thymeleaf
- C++
- 해시
- nestjs typeorm
- 카카오 알고리즘
- 카카오
- git
- nestJS
- C언어
- Nodejs
- AWS
- Today
- Total
목록# Language & Tools/C (12)
공부 기록장 💻
포인터의 개념과 주소 연산자 & - 포인터: 메모리의 주소를 가지고 있는 변수 - 변수는 메모리에 저장된다. 메모리는 바이트(byte) 단위로 주소가 매겨져 있는데, 주소를 이용해 메모리에 접근하며 값을 읽고 저장할 수 있다. 변수의 주소는, 변수가 차지하는 바이트의 주소 중에서 가장 낮은 주소가 된다. - 주소 연산자 &: 변수의 이름을 받아 변수의 주소를 반환하는 연산자 형식 지정자 16진수 출력- %p, 부호 없는 10진수 출력- %u 포인터의 선언과 초기화 - 포인터(pointer) 의 선언: (포인터가 가리키는 대상과 동일한 자료형) * (포인터 이름=포인터 변수명) 포인터 타입과 변수의 타입은 일치해야 함! 포인터에 의하여 참조되는 객체의 크기와 형식을 결정하는 것이 포인터의 타입이기 때문 -..
배열의 개념 - 동일한 자료형 & 같은 이름의 데이터 여러 개가 연속적으로 저장되어 있는 저장 장소 - 정수로 되어 있는 번호(=인덱스)로 각 배열의 요소를 구분하고, 인덱스를 이용하여 각 데이터에 접근 가능 배열의 선언 - 배열을 사용하기 위해 먼저 선언이 필요하다. 컴파일러에게 배열의 자료형, 배열 이름, 요소의 개수가 무엇인지 알리는 과정이다. int scores[10]; // int 형 scores 변수 10개 선언 (scores[0]~scores[10]) - 배열의 이름은 scores이고, int형 변수를 의미하는 배열의 요소들은 0번 인덱스부터 시작하여 9번까지 총 10개를 포함한다. - 인덱스의 범위는 언제나 0~(배열크기 -1) 이다. #define SIZE 10 #define SIZE2 ..
동적 메모리가 필요한 이유? - 배열을 선언할 때, 정확한 요소 개수를 알지 못해 충분한 양의 메모리 공간을 미리 확보해 놓는 경우가 있다. 이처럼 정적 메모리를 사용하는 경우에는, 미리 정해전 크기를 사용해야 하기 때문에 메모리 공간 사용에 있어 매우 비효율적이다. 따라서 프로그램 실행 도중에 필요한 만큼의 메모리를 동적으로 할당하여 사용하도록 하자. 변수가 생성되고 소멸되는 시간을 조절할 수 있으므로 매우 효율적이다. 동적 메모리를 사용하기 위해선 기본적으로 할당/사용/반납 의 과정이 필요하다. 동적 메모리 할당/반납 동적으로 메모리 공간을 확보하기 위해선, 운영체제에게 메모리 공간을 요청하는 단계가 필요하다. 헤더 파일의 malloc(), calloc(), realloc() 함수를 이용해 메모리 공..
구조체를 이용하여 데이터베이스의 기능을 하는 간단한 프로그램을 만들어 보자. (곡 명, 가수, 장르의 데이터를 담은 음악 파일을 추가, 출력, 검색, 삭제할 수 있는 프로그램) 필요한 함수와 자료들 하나씩 살펴보자. - 헤더 파일: strcmp() 문자열 처리 라이브러리 함수 - music 구조체와 구조체 배열: 곡 명(문자열), 가수(문자열), 장르(정수형) typedef struct music { char title[20]; char artist[20]; int genre; }MUSIC; int CNT = 0; MUSIC mlist[100] = { 0, }; 곡 명과 가수 이름은 문자형으로, 장르를 나타내는 변수는 정수형으로 멤버들을 선언하여 구조체를 정의한다. 가독성을 높이기 위해 typedef를 ..
구조체의 개념 - 구조체는 여러 자료형의 변수들을 하나로 묶어 새로운 자료형을 만든 것을 의미한다. - 배열과 비슷한 개념으로 보면 된다. 다만 다양한 자료형을 하나의 단위로 묶을 수 있다는 것이 차이점 구조체의 정의, 선언, 초기화 구조체는 'struct' 키워드를 사용하여 정의할 수 있다. 아래 예시는 학생의 학번, 이름, 학점을 하나의 단위로 묶어 새로운 자료형으로 정의하여 student 라는 이름의 구조체를 선언한 것이다. struct - 키워드 student - 구조체의 이름(태그) int number, char name[10], grade - 구조체의 멤버 #include //구조체 선언 struct student { //구조체 멤버 3개 정의 int number; char name[10]; ..
헤더 파일에 정의되어 있는 문자열 처리 라이브러리 함수들 size_t strlen(const char *str); - 기능: 문자열의 길이 반환 - 인수: 문자열 주소 - 반환값: 문자열의 길(마지막 NULL값 제외) #include #include int main(void) { char str1[10] = "Hi"; printf("%s의 문자열 길이 : %d\n", str1, strlen(str1)); printf("Hello 의 문자열 길이 : %d\n", strlen("Hello")); return 0; } char *strchr(const char *str, int c); - 기능: 문자열에서 문자를 찾는다. - 인수: 찾을 대상 문자열, 찾는 문자 - 반환값: 첫 번째 찾은 문자의 위치 주소, ..
파일의 개념 - 파일은 스트림(모든 입출력이 바이트 단위로 흐른다는 것)으로 취급되어, 일련의 연속된 바이트라고 볼 수 있다. - 파일 포인터(FILE pointer)를 이용해 입출력 동작이 발생하는 위치를 나타낼 수 있다. - 파일을 처음 열면 파일 포인터는 파일의 첫 번째 바이트를 가리키게 되고, 입출력 연산이 실행되며 파일 포인토가 자동적으로 이동된다. - 텍스트 파일은 연속적인 줄로 구성되어 있어, 각 줄의 끝에는 줄바꿈 문자('\n' 또는 '\r'의 조합으로, 운영 체제마다 조금씩 다름)가 포함된다. 파일 처리 - 파일을 처리하기 위해서는 기본적으로 3가지의 동작이 필수적으로 요구된다: 파일 열기 / 읽고 쓰기 / 파일 닫기 - 가장 먼저 파일 포인터를 생성해야 한다. 헤더 파일에 typedef..
1. 두 파일을 생성하여 입력받는 문자들을 각각 파일에 출력한 뒤, 두 파일이 동일한지 비교하는 프로그램 (#1, #7 참고) 중요하다고 생각하는 부분 - 파일 포인터 생성 - 파일 입출력 관련 라이브러리 함수 : fopen_s() / fprintf() / fclose() / fgetc() / fputc() / feof() - getchar()함수의 반환값 EOF // 두 파일을 생성하여 각 파일에 문자들을 입력받아 저장하고, 두 파일의 내용이 동일한지 판별하는 프로그램 #include int main(void) { // 두 개의 파일 포인터, 파일명 저장할 문자열 생성, 입력 받아 파일에 저장할 문자/비교할 두 개의 문자 생성 FILE* fp1 = NULL, * fp2 = NULL; char fname..
함수의 종류에는 두 가지가 있다. 사용자가 직접 정의하여 만드는 '사용자 정의 함수', 그리고 자주 사용되어 프로그래머들이 미리 만들어놓은, 컴파일러에서 제공되는 '라이브러리 함수'가 있다. 기본적으로 사용하는 printf(), scanf() 함수들은 헤더 파일 내에 이미 정의되어 있는 라이브러리 함수들 중 일부이다. 사용자 정의 함수는 특정한 기능을 수행하는, 말그대로 프로그래머 개인이 직접 작성한 함수를 의미한다. 사용자 정의 함수를 어떻게 작성하는지, 간단히 정리해보고자 한다. 함수의 정의(defnition) 함수엔 헤더(header)와 몸체(body) 부분이 존재한다. 헤더 영역에는, 함수를 호출하여 얻는 결과값의 반환형, 그리고 함수의 이름, 괄호에는 매개변수의 목록(반환형과 매개 변수명)을 작..
1. 초기값 입력 받아 1씩 감소시키며 0이 될 때까지 반복하여 출력 (+1. for문 사용 / 2. while문 사용) for문을 사용할 때엔 제어 변수의 초기값을 n으로 하여, 0이 될 때 까지 1씩 감소하는 i를 출력한다. #include int main(void) { int n; printf("카운터의 초기값: "); scanf_s("%d", &n); for (int i = n;i > 0;i--) printf("%d ", i); printf("\n"); return 0; } while문을 사용할 때엔 후위 연산자를 이용하여 n의 값을 1씩 감소시키도록 하여 n의 값을 출력한다. #include int main(void) { int n; printf("카운터의 초기값: "); scanf_s("%d"..
1. switch-case문을 사용해 모음, 자음 구분하는 프로그램 (+문자가 아닌 경우 오류 메시지를 출력하고, 다시 문자를 입력 받는 코드 추가) #include int main(void) { char ch; do { printf("문자를 입력하시오: "); scanf_s(" %c", &ch); } while (ch = 'z'); switch (ch) { case 'a': case 'e': case 'i': case 'o': case 'u': printf("모음입니다.\n"); break; default: printf("자음입니다.\n"); break; } return 0; } 반복문 do~ while문을 사용해서 입력받는 문자를 판별하는 코드를 추가한다. getchar()함수를 이용하는 경우, 반복..