C 31

구조체란?

구조체의 목적구조체(struct)는 서로 다른 타입의 변수들을 하나의 묶음(단위)으로 다룰 수 있게 해주는 사용자 정의 자료형입니다.예를 들어 학생 한 명의 정보를 저장한다고 할 때:이름: 문자열전화번호: 문자열성별: 문자점수: 정수이걸 각각 따로따로 변수로 만들면 관련성이 떨어지고 관리가 어렵습니다.그래서 등장한 것이 구조체!struct student { char name[10]; char phone[20]; char gender; int score;};이렇게 하면 학생 한 명의 모든 정보를 하나로 묶어서 다룰 수 있게 됩니다.→ 이름, 전화번호, 성별, 점수를 담는 하나의 구조체 "가방"이 만들어진다고 생각하시면 됩니다. 구조체 정의와 선언✔ 구조체 정의(자료형 생성)struct..

C 02:18:51

문자열 상수를 const char*에 저장하는 이유

int main() { int a = 5; char c = 'A'; const char *p = "Hello"; *p = 'a'; // ❌} const char *p = "Hello"; "Hello"는 문자열 상수입니다.컴파일 시 읽기 전용(read-only) 메모리 영역에 저장됩니다.p는 그 주소(즉, 'H'의 주소)를 가리키는 포인터입니다.따라서 p는 "Hello"라는 문자열 상수를 가리키는 포인터입니다. const char *p 뜻: p가 가리키는 곳의 값을 바꾸지 않겠다.즉, *p = 'a';는 금지입니다.왜냐하면:"Hello"는 상수이기 때문에 읽기는 가능하지만 쓰기는 금지입니다.*p = 'a';는 문자 'H'를 'a'로 바꾸려고 하는 시도인데,→ 이것은 읽기 전용 메..

C 00:01:28

포인트 배열로 여러개 문자열 처리

char *p[3] = {"apple", "banana", "orange"};p[0], p[1], p[2]는 각각 문자열 "apple", "banana", "orange"의 주소를 담고 있는 포인터입니다.그래서 포인터 배열입니다. 포인터 배열 p는 메모리상에 다음과 같이 구성됨:이름값 설명p[0]→ 주소 0x1000"apple"의 시작주소p[1]→ 주소 0x2000"banana"의 시작주소p[2]→ 주소 0x3000"orange"의 시작주소→ 이 주소들은 문자열이 저장된 위치를 가리키고 있습니다. 각 문자열은 메모리에 이렇게 저장됨:"apple" → 'a' 'p' 'p' 'l' 'e' '\0'"banana" → 'b' 'a' 'n' 'a' 'n' 'a' '\0'"orange" → 'o' 'r' '..

C 2025.06.14

문자열을 배열로 처리할 때 주의할점

char str[7] = "banana";✔ 여기서 일어나는 일:"banana"는 문자열 상수이고, 컴파일 시 읽기 전용 메모리에 저장됩니다.그러나 str[7]이라는 배열이 있으므로, "banana"에 들어 있는 6글자 + \0을 배열에 복사합니다.str은 스택(stack) 메모리 위에 존재합니다.str[0]부터 str[6]까지 각각 'b', 'a', 'n', 'a', 'n', 'a', '\0'이 복사됩니다.중요: str은 문자열 상수의 주소가 아니라, 복사된 데이터입니다. char buf[6];strcpy(buf, "apple");✔ 문자열 대입 시 오류:buf = "apple"; //오류배열 이름(buf)은 주소 상수이기 때문에, 대입 연산(=)으로는 주소를 바꿀 수 없습니다.buf는 이미 고정된 ..

C 2025.06.14

배열 vs 포인터 : 문자열처리

문자열은 주소이다printf("%s", "apple");"apple"은 문자 'a'가 저장된 주소값입니다.%s는 그 주소로 이동해서, \0이 나올 때까지 문자들을 출력합니다.→ 즉, "apple"이라는 문자열 자체가 %s에 들어가는 게 아니라,문자열이 저장된 메모리 주소가 전달되고, %s는 그 주소부터 끝까지 읽어 출력합니다. "apple" + 1은 무엇인가?printf("%s", "apple" + 1);"apple" → 주소값 (예: 0x1000)"apple" + 1 → 0x1001 → 'p'부터 시작그래서 출력은 "pple"가 됩니다.이처럼 문자열은 배열처럼 포인터 연산이 가능합니다. 문자열을 포인터에 대입하는 경우char *p = "apple";"apple"은 읽기 전용(상수) 메모리 공간에 저장됩..

C 2025.06.14

문자열 상수

컴퓨터는 문자 자체를 저장할 수 없습니다✔ 컴퓨터는 오직 “숫자”만 저장할 수 있습니다우리가 보기엔 'A'라는 문자가 있지만,컴퓨터에게는 'A'도 그냥 숫자 65입니다.왜 65일까요? → ASCII 코드 덕분입니다.ASCII 코드란?✔ ASCII (American Standard Code for Information Interchange)문자 하나하나에 정수값을 부여한 표준예시:문자ASCII 값 (10진수)'A'65'B'66'a'97'0'48'\n'10 (줄바꿈)'\0'0 (문자열 끝) 💡 그래서 char ch = 'A';라고 선언하면?실제 메모리에는 문자 'A'가 저장되는 것이 아니라정수 65가 1바이트 크기로 저장됩니다. 문자 상수 vs 문자열 상수의 차이문자'A'정수 651바이트 정수문자열"A"문..

C 2025.06.14

void 포인터

void 포인터란?void *ptr;void *는 “아무 타입의 주소든 저장할 수 있는 포인터”입니다.즉, 형(type)이 없는 포인터입니다.int*, char*, float* 다 저장할 수 있습니다. int a = 10;float b = 3.14;char c = 'A';void *ptr;ptr = &a; // OKptr = &b; // OKptr = &c; // OK결론:void *는 “만능 포인터”입니다.→ 어떤 타입의 주소도 받아들일 수 있는 범용 포인터입니다.왜 이런 게 필요할까?함수에서 여러 타입을 처리할 때 쓰입니다.대표적으로 malloc() 함수는 void *를 반환합니다. void 포인터의 한계 (단점)❌ void 포인터는 역참조가 불가능합니다void *ptr = &a;..

C 2025.06.14

포인터 상수

기본 포인터와 const 한 개 (어디에 붙느냐에 따라 다름) 먼저, 일반 포인터 구조 복습int a = 10;int *p = &a;여기서 p는 두 가지를 바꿀 수 있습니다:p 자신이 가리키는 대상을 바꿀 수 있습니다 → p = &b;p가 가리키는 값(= a의 값)도 바꿀 수 있습니다 → *p = 20;즉, 포인터는 "가리키는 대상도 바꾸고", "값도 바꿀 수 있다" → 자유로운 상태입니다. 상황 1: const int *p;또는int const *p; 가리키는 대상의 값을 바꿀 수 없다.하지만 p가 가리키는 대상을 바꾸는 건 가능하다.💡 예시:int a = 10, b = 20;const int *p = &a; // 또는 int const *p = &a;*p = 15; // 오류! 값 변경 불..

C 2025.06.14

2차원 배열

2차원 배열의 구조int a[3][2] = { {1, 2}, {3, 4}, {5, 6} };이 배열은 총 3행 2열의 정수형 2차원 배열입니다.💡 메모리 구조 (연속적 저장) [1] [2] [3] ↑ ↑ ↑ a[0][0] a[0][1] a[1][0] ...배열은 한 줄로 연속적인 메모리에 저장됩니다.a[0]은 첫 번째 행(1차원 배열 {1, 2})의 시작 주소입니다.a는 배열 전체의 시작 주소이며, a == &a[0]이 항상 성립합니다. 포인터 연산의 차이점: a vs a[0]📌 a 자체는 포인터처럼 행동하지만 “행 단위”로 이동합니다a → 0행의 시작 주소 (&a[0])a + 1 → 1행의 시작 주소 (&a[1])a + 2 → 2행의 시작 주소 (&a[2]..

C 2025.06.14

포인터 배열

포인터 배열이란?int *p[5];이 선언의 의미는 다음과 같습니다:“정수형(int)을 가리킬 수 있는 포인터 변수 5개를 배열로 선언한다.”p는 배열입니다.p[0], p[1], ..., p[4]는 각각 int형을 가리킬 수 있는 포인터 변수입니다.즉, p[0], p[1], p[2] … 하나하나가 다음선언과 같습니다:int *p0;int *p1;int *p2;...→ 이들을 하나의 배열로 묶은 것이 int *p[5];입니다. 포인터 배열과 일반 배열의 차이일반 배열:int arr[5]; // 정수형 5개짜리 배열포인터 배열:int *p[5]; // int형 포인터 5개짜리 배열일반 배열은 값을 저장포인터 배열은 주소(다른 변수를 가리키는 주소)를 저장 포인터 배열의 동작 방식예시 코드:int a = 3;..

C 2025.06.13