본문 바로가기

전체 글141

C 언어 void 포인터 (void*) 범용 포인터로서, 어떤 포인터 타입도 void*에 대입할 수 있다. C#의 object 타입과 비슷하다#include int main(void){ /* 예시 배열 */ int arr[5] = {1, 2, 3, 4, 5}; /* void* 포인터에 arr의 주소를 저장 */ void *vp = arr; /* arr의 합계를 구하려면, int*로 캐스팅해야 함 */ int sum = 0; for (int i = 0; i int*로 변환 후 [i] 접근 */ sum += ((int*)vp)[i]; } printf("arr의 합계: %d\n", sum); /* 다른 타입에도 바로 대입 가능 (단, 역참조 시 캐스팅 필수) */ double.. 2025. 4. 10.
C 언어 함수 포인터 함수의 시작 주소를 가리키는 포인터로, 실행 도중 특정 함수를 동적으로 선택하여 실행할 수 있다. C#의 delegate와 비슷하다 선언 형식은 다음과 같다 (*)(); 오른쪽 - 왼쪽 규칙으로 해석한다 함수 포인터 또한 객체이기 때문에 배열에 담을 수 있다#include /* 예: 사칙연산 함수를 정의 */int add(int a, int b) { return a + b;}int sub(int a, int b) { return a - b;}int mul(int a, int b) { return a * b; }int divide(int a, int b) { /* 0으로 나눌 때는 예외 처리가 필요하지만, 여기서는 단순히 처리 */ return b == 0.. 2025. 4. 10.
C 언어 공용체 (union) 공용체는 구조체와 문법이 비슷하지만, 모든 멤버가 같은 메모리 위치를 공유한다즉, 공용체의 크기는 가장 큰 멤버의 크기로 결정되는 것이다 여러 자료형을 동시에 저장하지는 못하지만, 동일 메모리 공간을 다르게 해석하고 싶을 때 유용하다#include /* union + 비트 필드 예시: - 같은 메모리를 두 가지 방식으로 해석하려는 목적. - 하나는 비트 필드 구조체로 해석하고, 다른 하나는 raw(16비트 정수) 값으로 직접 해석할 수 있다.*//* 비트 필드 구조체 (16비트) */typedef struct { unsigned short is_on : 1; /* 1비트 (켜짐/꺼짐) */ unsigned short is_enabled : 1; /* 1비트 .. 2025. 4. 10.
C 구조체와 비트 플래그 비트 필드구조체 멤버에 대해 몇 비트만 사용할지를 지정할 수 있는 기능이다unsigned short a : 1; => a 멤버에 1비트 할당unsigned short a; => short 타입의 a멤버 선언구조체 안에 비트 필드들을 구성하면, 플래그 여러 개를 한정된 크기로 묶어 효율적으로 저장할 수 있다#include /* MyFlags 구조체: - 총 16비트(unsigned short) 중 일부를 비트 필드로 사용 - 여러 상태 플래그를 효율적으로 관리하기 위한 예시 */typedef struct { unsigned short is_on : 1; /* 1비트 (켜짐/꺼짐) */ unsigned short is_enabled : 1; /* 1비트 (활성화/비활성화) .. 2025. 4. 10.
C 구조체 사용 시 포인터 저장 문제 파일에 구조체 데이터를 저장할 때 포인터를 사용하면 에러가 발생할 수 있다해당 포인터가 가리키는 영역은 파일에 직접 저장되지 않기 때문이다 또한 디스크에 저장된 포인터는 다음에 로드했을 때 유효하지 않은 주소이다#include #include #include typedef struct { char *name; // 문자열을 동적 할당 받아 저장할 포인터 int age;} PersonPtr_t;int main(void) { const char *filename = "person_ptr.bin"; PersonPtr_t p1; FILE *fp; /* 1. 구조체의 포인터 멤버에 동적 할당 문자열 저장 */ p1.age = 25; p1.name = (char *)m.. 2025. 4. 9.
C 언어의 구조체 구조체란 여러 자료형을 가진 변수들을 하나의 패키지로 묶은 데이터의 집합이다 구조체의 장점비슷한 데이터를 모아 코드를 빠르게 이해할 수 있다매직 넘버를 방지하여 실수를 줄일 수 있다원자성을 보장하는 연산을 통해 실수를 방지할 수 있다 구조체의 선언 및 사용구조체는 지역변수로 선언 시 초기화되지 않으므로 명시적으로 초기화해줘야 한다. 전역변수로 선언시 BSS 영역에 의해 초기화 되지만, 함수 내에서 지역변수로 선언되면 메모리에 남아있는 쓰레기 값이 들어가기 때문이다#include struct MyData { int x; double y;};/* 전역 변수: BSS 영역에 의해 자동으로 0으로 초기화됨 */struct MyData globalData;int main(void) { /* 지역 .. 2025. 4. 9.
반응형