[C/C++ Tip] 17. Static 변수와 Extern 변수의 차이점
·
🔷 C언어 30강
extern (고급)Static 변수와 Extern 변수는 C언어에서 변수의 스코프(visibility)와 생명 주기(lifetime)를 관리하는 데 사용되는 키워드이다. 이 둘의 주요 차이점은 다음과 같다:Static 변수:스코프: Static 변수는 선언된 범위(함수 내부 또는 파일 내부)에 제한된다.생명 주기: 프로그램 실행 시작 시 할당되고 프로그램 종료 시 해제된다.목적: 같은 파일 내에서만 접근 가능한 변수를 만들거나, 함수 호출 간 상태를 유지할 수 있는 지역 변수를 선언하는 데 사용된다.Extern 변수:스코프: Extern 키워드는 다른 파일에 정의된 전역 변수나 함수를 참조하는 데 사용된다.생명 주기: 해당 변수가 정의된 파일 내에서 프로그램 실행 시작 시 할당되고 프로그램 종료 시 해..
[C/C++ Tip] 16. Extern 중복 문제 해결 (Include Guard)
·
🔷 C언어 30강
C언어 extern (중급)C언어에서 헤더 파일의 중복 포함은 다양한 문제를 일으킬 수 있다. 예를 들어, 프로젝트 단위가 커져 같은 헤더 파일이 여러 번 포함되면 변수나 함수 선언이 중복되어 컴파일 오류가 발생할 수 있다. 이를 방지하기 위해 "Include Guard"라는 기법이 널리 사용된다. Include Guard는 전처리기(preprocessor) 지시문을 사용하여 헤더 파일이 한 번만 포함되도록 보장한다. 가장 일반적인 방법은 #ifndef, #define, #endif 지시문을 사용하는 것이다. 중복 포함 방지: 헤더 파일이 여러 번 포함되는 것을 방지하여, 중복 선언으로 인한 컴파일 오류를 예방한다.프로그램 구조 개선: 코드의 모듈화와 재사용성을 높이며, 프로그램의 구조를 명확하게 한다...
[C/C++ Tip] 15. extern 기본
·
🔷 C언어 30강
Extern (초급)C언어에서 extern 키워드는 다른 파일에 정의된 전역 변수나 함수를 참조할 수 있도록 해준다. 이는 프로그램의 여러 파일 간에 변수나 함수를 공유할 때 매우 유용하다. extern의 사용은 큰 프로젝트에서 소스 코드를 모듈화하고 관리하기 쉽게 만들어 준다.⭐1. extern 사용 예제다음 예제에서는 두 개의 파일을 사용하여 extern의 기본적인 사용 방법을 보여준다.main.c#include // 다른 파일에서 정의된 변수를 참조하기 위해 extern 사용extern int sharedVar;int main() { printf("Shared Variable: %d\n", sharedVar); return 0;}shared.c// sharedVar는 이 파일에서 정의되며..
[C/C++ Tip] 14. 동적 메모리 할당
·
🔷 C언어 30강
동적 메모리 할당C언어에서 동적 배열은 프로그램 실행 중에 배열의 크기를 결정하고 메모리를 할당할 수 있게 해주는 매우 유용한 기능이다. 동적 배열은 malloc, calloc, 또는 realloc 함수를 사용하여 힙(Heap) 영역에 메모리를 할당함으로써 생성된다. 이러한 방식은 정적 배열과 달리, 실행 시간에 배열의 크기를 유연하게 조절할 수 있게 해준다.⭐1. 필요성유연성: 프로그램 실행 중에 배열의 크기를 결정할 수 있으므로, 사용자 입력이나 다른 실행 시간 데이터에 기반한 메모리 할당이 가능하다.메모리 효율성: 필요한 만큼의 메모리만 할당하여 사용하므로, 메모리 낭비를 줄일 수 있다.⭐2. 메모리적인 관리의 장점 및 단점2.1. 장점 메모리 최적화: 정적 배열과 달리, 필요한 만큼의 메모리만 사..
[C/C++ Tip] 13. MCU 제어를 위한 비트 연산
·
🔷 C언어 30강
MCU 제어를 위한 비트 연산펌웨어는 하드웨어를 제어하는 소프트웨어로, 보통 임베디드 시스템, 마이크로컨트롤러, 다양한 전자 장비 등에서 작동한다. 펌웨어 개발에서 하드웨어의 세밀한 제어가 필요할 때, 비트 연산은 그 대표적인 방법중 하나이다. C언어의 비트 연산자를 사용하면 레지스터 설정과 같은 저수준 작업을 효율적으로 처리할 수 있다. 이러한 연산자에는 AND(&), OR(|), XOR(^), NOT(~), 비트 시프트(>) 등이 있다. 각 연산자의 사용 예를 통해, 어떻게 이들을 활용하여 펌웨어 코드를 작성하는지 살펴본다.⭐1. 비트 연산의 장점직접적인 하드웨어 제어: 비트 단위로 하드웨어 레지스터를 직접 조작할 수 있다.메모리 및 처리 속도 효율성: 불필요한 메모리 접근을 줄이고, CPU의 비트 ..
[C/C++ Tip] 12. 포인터가 헷갈릴 수 밖에 없는 이유: 별(*)의 종류와 정체
·
🔷 C언어 30강
C언어 포인터의 이해 2편C언어를 배우면서 가장 많이 혼란을 겪는 주제 중 하나가 바로 포인터이다. 특히 * 기호의 다양한 역할이 이 혼란의 주범이다. 이 포스팅에서는 * 기호가 가지는 세 가지 역할을 친절하게 설명함으로써 포인터에 대한 당신의 이해를 한 단계 업그레이드시킬 것이다.⭐1. 포인터 변수 선언: *의 첫 번째 정체포인터를 선언할 때 *를 사용하는 이유는, 단순히 "이 변수는 메모리 주소를 저장한다"는 사실을 나타내기 위함이다. int* ptr;라고 선언하면, "ptr은 정수의 주소를 저장하는 변수"라는 의미가 된다. 여기서 *는 포인터 변수의 타입 부분에 포함되어, 이 변수가 "주소"를 저장하는 특별한 종류의 변수임을 알려주는 역할을 한다.⭐2. 역참조 연산자: *의 두 번째 정체변수 앞에 ..
[C/C++ Tip] 11. C언어 포인터 기본 사용법
·
🔷 C언어 30강
C언어 포인터의 이해 1편포인터는 C언어를 배우는 사람에게는 종종 어려움을 주는 주제 중 하나이다. 복잡해 보이지만 한 번 이해하면 강력한 도구가 될 수 있다. 이 포스팅에서는 포인터의 기본 개념을 쉽게 풀어 설명하고, 몇 가지 팁과 함께 실제 코드 예시를 통해 그 사용법을 알아보겠다. ⭐1. 포인터란 무엇인가?포인터는 간단히 말해, 메모리 주소를 저장하는 변수이다. 즉, 포인터를 통해 다른 변수의 위치를 알고, 그 위치에 접근하여 값을 읽거나 변경할 수 있다. C언어에서 포인터는 데이터의 동적 관리와 복잡한 데이터 구조의 구현에 필수적인 요소이다.⭐2. 포인터의 선언포인터를 선언하는 방법은 다음과 같다.타입 *포인터변수명;예를 들어, int형 데이터를 가리키는 포인터를 선언하고 싶다면 다음과 같다.in..
[C/C++ Tip] 10. Call by Value vs Call by Reference
·
🔷 C언어 30강
Call by  Value Vs Call by Reference프로그래밍, 특히 C언어에서 'Call by Value'와 'Call by Reference'의 개념은 기본적이면서도 핵심적인 부분이다. 이 두 호출 방식의 차이점을 이해하는 것은 다음과 같은 이유로 중요하다. 1. 코드의 안정성 보장'Call by Value'는 함수에 변수의 복사본을 전달함으로써 원본 데이터를 안전하게 보호한다. 이는 원하지 않는 데이터 변경으로부터 값들을 보호하는 데 필수적이다. 반면, 'Call by Reference'는 원본 데이터에 직접 영향을 줄 수 있기 때문에, 데이터를 의도적으로 변경하고자 할 때 유용하다. 이 두 방식을 적절히 사용함으로써 프로그램의 안정성과 예측 가능성을 높일 수 있다. 2. 메모리와 성능 ..
[C/C++ Tip] 9. memset, memcpy
·
🔷 C언어 30강
C언어 memset, memcpy 함수 사용법C언어에서 배열을 다루기 위한 여러 함수들이 있으며, 이 중에서 memset과 memcpy는 가장 기본적이면서도 중요한 함수이다. 이들 함수는 메모리 관리와 배열 조작을 효율적으로 수행할 수 있도록 도와준다.⭐1. memset 함수void *memset(void *ptr, int value, size_t num);ptr: 설정하고자 하는 메모리의 시작 주소value: 메모리에 설정할 값. int형으로 전달되지만, 실제로는 unsigned char로 변환되어 메모리에 저장된다.num: value로 설정할 바이트의 수#include #include int main() { int array[10]; memset(array, 0, sizeof(array))..
[STM32] 4. GPIO Output 설명
·
🧊 STM32
STM32CubeIDE에서 GPIO 설정을 할 때 여러 옵션이 제공되는데, 각각의 설정 옵션에 대해 간단히 설명한다. 이 설정들은 CubeMX 통합 환경에서 GPIO 핀의 기능과 특성을 정의하는 데 사용된다. 이 전 포스팅에서 STM32 내장 LED를 제어하기 위해 GPIO Output을 설정하였으니 참고하길 바란다.📌 1. GPIO Output LevelGPIO 출력 레벨은 핀이 출력 모드일 때 초기 출력 상태(높음 또는 낮음)를 설정한다. 이 설정은 핀이 디지털 출력으로 구성될 때 중요하며, 기기가 리셋되거나 전원이 켜질 때 핀의 상태를 결정한다.High (높음): 핀의 초기 상태를 높은 전압(보통 VDD)으로 설정한다.Low (낮음): 핀의 초기 상태를 낮은 전압(GND)으로 설정한다.이 설정은 ..
18진수
'분류 전체보기' 카테고리의 글 목록 (5 Page)