목록전체 글 (130)
문타쿠, 공부하다.

매개변수 전달 기법 C언어에서는 참조형을 포인터로 구현 인수(상수, 변수), 매개변수, 파라미터, 아규먼트 등은 다 같은 말 매개변수는 Stack 영역 사용 Call by value #include int Add(int num1, int num2); int main(void) { int a = 5, b = 10; printf("5 + 10 = %d\n", Add(a, b)); return 0; } int Add(int num1, int num2) { return num1 + num2; } Call by reference #include int Add(int* num1, int* num2); int main(void) { int a = 5, b = 10; printf("5 + 10 = %d\n", Add(..

컴퓨터 메모리 종류 컴퓨터와 메모리 CPU는 연산할 코드(기계어)와 대상 정보를 모두 메모리로부터 가져옴 메모리는 변수를 통해 사용 모든 메모리는 바이트 단위의 고유한 주소(=위치정보)를 가짐 64bit 시스템에서 메모리 주소 길이는 64bit 메모리 종류 Stack 지역/자동변수, 보통 1MB Heap 동적 할당 메모리 실행 코드 text section(실행 코드 기계어) data section: Read Only(문자열 상수), Read/Write(정적 메모리, 전역변수) 메모리 관리 함수 malloc(), calloc() / free() realloc() memcpy(), strcpy() memcmp(), strcmp() sprintf() C언어는 메모리 관리에 있어서 자유도가 매우 높다. => 그..

사용자 정의 함수 기초 이론 함수는 '반환자료형 이름(매개변수 목록)' 형식으로 기술 호출자(Caller) 함수와 피호출자(Callee) 함수로 관계를 규정할 수 있음(Binding) 호출자는 피호출자 함수의 매개변수 초깃값을 기술해야 할 의무가 있음 피호출자 함수는 호출자 함수에게 값을 반환 C언어는 함수로 시작해서 함수로 끝난다. 함수는 하나의 기능/덩어리/단위로 생각하자. 입출력 함수와 같이 여러 함수들을 합쳐서 C언어의 런타임 Runtime 라이브러리 Library라고 한다. = CRL SDK(Software Development Kit) 어떤 소프트웨어를 만드는 데 필요한 라이브러리를 모아놓은 공구상자 같은 존재 SDK는 라이브러리/API/함수의 집합체 어떤 때는 sdk 또 어떤 때는 라이브러리..

배열의 기본 문법 배열 형식이 같은 자료 여러 개를 모아 한 덩어리로 관리하는 문법 여러 요소를 식별하기 위해 인덱스를 사용하며 0부터 시작 배열의 이름은 0번 요소의 메모리 주소에 대한 식별자이며 상수 문자 배열 (문자열) 문자열의 실체는 char[ ] 문자열 상수란 쓰기가 허용되지 않는 이름이 없는 char[ ] 문자열의 끝은 반드시 \0(NULL) 문자열 상수는 보통 포인터를 사용해 관리 [필수 실습 문제] 배열에서 최댓값 찾기 #include int main(void) { int aList[5] = { 0, }; int max = 0; printf("aList: %d, %d, %d, %d, %d\n\n", \ aList[0], aList[1], aList[2], aList[3], aList[4])..

조건 기반 반복 while과 무한 루프 if문과 유사한 구조 조건식이 참일 경우 구간 코드를 계속 반복해서 수행 반복 수행 구간 코드 내부에서 반복을 멈출 수 있는 연산이 반드시 있어야 함 무한루프는 최악의 논리 오류 중 하나 -> CPU 점유율이 100%가 돼버림 [필수 실습 문제] 한 줄에 * 출력 #include int main(void) { int input = 0; printf("1 ~ 9 중에서 정수를 하나 입력하세요."); printf(">> "); scanf_s("%d", &input); if (input 9) { printf("입력 가능한 숫자는 1 ~ 9입니다."); return 0; } while (input != 0) { printf("* "); input--..

if문과 스코프 if 분기문 실행의 절차적 흐름을 제어하는 제어문 조건식의 결과에 따라 절차상 수행할 구문이 달라질 수 있는 제어문 삼항 연산자와 논리적으로 유사 Scope 여러 개의 구문을 하나로 묶는 역할 -> { 중괄호 } [필수 실습 문제] 최댓값 구하기 - if문 버전 #include int main(void) { int num1 = 0; int max = 0; printf("세 개의 정수 입력 ㄱ\n"); printf(">> "); scanf_s("%d", &num1); max = num1; printf(">> "); scanf_s("%d", &num1); if (num1 > max) max = num1; printf(">> "); scanf_s("%d", &num1); if (num1 > m..

연산자 기본 이론 연산자 연산자는 CPU 연산과 직결되는 문법 연산자 자체는 하나의 항 여러 항을 모아 연산식 작성 연산자와 피연산자로 구성 피연산자가 하나면 단항 연산자, 두 개 항이면 이항 연산자, 세 개 항이면 삼항 연산자 연산자 종류 산술 연산자 대입 연산자 형 변환 연산자 단항 증/감 연산자 비트 연산자 관계 연산자, 논리 연산자, 조건 연산자 sizeof 연산자 연산자 우선 순위 연산자 결합성 우선순위가 같은 경우 어떤 것을 먼저 연산할 것인지 나타내는 것 산술 연산자 대표적인 이항 연산자: +, -, *, /, % 연산의 결과로 임시결과 발생 정수 간 나눗셈의 결과는 반드시 정수가 되며 소수점 이하는 절사 이형자료 연산과 형승격 산술 연산과 형승격 임시결과는 피연산자 표현범위 이상의 표현이 ..

51.4 연습문제: 압축 헤더 크기 구하기 #include struct CompressHeader { char flags; int version; }; int main(void) { struct CompressHeader header; printf("%zd\n", sizeof(header)); return 0; } 51.5 연습문제: 패킷 크기 조절하기 #include #pragma pack(push, 1) struct Packet { short length; int seq; }; #pragma pack(pop) int main(void) { struct Packet pkt; printf("%zd\n", sizeof(pkt)); return 0; } 51.6 심사문제: 암호화 헤더 크기 구하기 #incl..

INTRO 컴퓨터의 CPU가 메모리에 접근할 때 32비트 CPU는 4바이트 단위, 64비트 CPU는 8바이트 단위로 접근한다. 만약 32비트 CPU에서 4바이트보다 작은 데이터에 접근하게 될 경우 내부적으로 시프트 연산이 발생해서 효율이 떨어지게 되는데... 그래서 C언어 컴파일러는 구조체가 메모리에 올라갔을 때, CPU가 메모리의 데이터에 효율적으로 접근할 수 있도록 구조체를 일정한 크기로 정렬한다. => 구조체 멤버 정렬 51.1 구조체 크기 알아보기 #include struct PacketHeader { char flags; int seq; }; int main(void) { struct PacketHeader header; printf("구조체 크기: %zd\n", sizeof(header)); ..

50.2 연습문제: 사각형의 넓이 구하기 #include #include #include struct Rectangle { int x1, y1; int x2, y2; }; int main(void) { struct Rectangle rect; int area; rect.x1 = 20; rect.y1 = 20; rect.x2 = 40; rect.y2 = 30; int width = abs(rect.x2 - rect.x1); int height = abs(rect.y2 - rect.y1); area = width * height; printf("%d\n", area); return 0; } 50.3 심사문제: 두 점 사이의 거리 구하기 #define _CRT_SECURE_NO_WARNINGS #include..