C 언어 기초 개념 정리 (포인터, 자료형, 문자열, 메모리) ex.250512 - Hwanghyewon06/c- GitHub Wiki


📘 C 언어 기초 개념 정리 (포인터, 자료형, 문자열, 메모리)

✅ 1. char와 문자열 처리, 아스키 코드

🔹 예제 코드

char* s = "ABC";
printf("%c %d\n", s[0], s[0]); // A 65 

🔸 개념 설명

  • char는 1바이트(8비트) 정수형 → 문자를 저장
  • C의 문자열: char 배열 + 마지막에 \0 (null 문자) 포함
  • 문자열 "ABC"는 메모리에 다음과 같이 저장됨:
+----+----+----+----+
| A  | B  | C  | \0 |
+----+----+----+----+
  s   s+1  s+2  s+3
  • s[0] == 'A' → 아스키 값은 65
  • %c → 문자 출력, %d → 정수(아스키 코드) 출력

✅ 2. 포인터 기본 개념과 문자열 포인터

🔹 예제 코드

char* s = "ABC";
printf("%s\n", s);     // ABC
printf("%s\n", s + 1); // BC

🔸 개념 설명

  • char* s는 문자열 "ABC"의 시작 주소를 가리킴
  • s + 1 → 포인터 연산으로 다음 문자('B')의 주소
  • 따라서 "BC" 출력됨 ('B', 'C', '\0')

✅ 3. 문자열을 아스키 코드로 출력

🔹 예제 코드

void PrintStringToAscii(char* s1) {
    for (int i = 0; s1[i] != '\0'; ++i)
        printf("%c : %d\n", s1[i], s1[i]);
}

🔸 개념 설명

  • 문자열 끝까지 순회하며, 문자와 아스키 값을 출력
  • 예: "ABC"
A : 65
B : 66
C : 67

✅ 4. double 자료형과 포인터 연산

🔹 예제 코드

double da[4] = { 1.1, 2.2, 3.3, 4.4 };
double* pd = &da[1];

printf("%g %g\n", da[1], pd[0]); // 2.2 2.2
printf("%g %g\n", da[2], pd[1]); // 3.3 3.3

🔸 개념 설명

  • double: 8바이트 실수형
  • double* pd = &da[1] → 2.2의 주소를 가리킴
  • pd[1] == *(pd + 1) == da[2]

✅ 5. 배열과 포인터의 차이

🔹 예제 코드

char* s = "ABC";
char arr[4] = "ABC";

🔸 비교표

항목 포인터(char* s) 배열(char arr[4])
메모리 영역 코드 영역 (읽기 전용) 스택 메모리
수정 가능성 X (문자열 상수) O (값 변경 가능)
크기 포인터: 8바이트(x64 기준) 배열: 데이터 크기만큼(4B)
  • "ABC"는 문자열 상수 → 상수 영역에 저장
  • char*는 주소만 저장, char arr[]은 실제 값을 복사

✅ 6. 포인터 연산과 주소 출력

🔹 예제 코드

int n = 10;
int* p = &n;

printf("%p %p\n", &n, p);
printf("%p %p\n", &n + 1, p + 1);

🔸 개념 설명

  • %p → 주소 출력 포맷
  • p + 1sizeof(int)만큼 (보통 4바이트) 증가
  • 포인터 연산은 자료형 크기 단위로 주소 이동

✅ 7. 다양한 포인터 타입 비교

포인터 타입 단위 연산 크기 사용 예
char* 1바이트 문자열, 문자 배열
int* 4바이트 정수 배열
double* 8바이트 실수 배열

📌 배열과 포인터의 공통점

  • arr[i] == *(arr + i)
  • p[i] == *(p + i)

배열 이름은 첫 번째 요소의 주소 arr == &arr[0]


✅ 8. 문자와 정수의 관계 (아스키 코드)

🔹 예제 코드

int n1 = 65;
int n2 = 'A';

printf("%d %d\n", n1, n2); // 65 65
printf("%c %c\n", n1, n2); // A A

🔸 개념 설명

  • 'A'의 아스키 값은 65
  • charint 간 변환 가능 (범위 주의)
  • %d: 정수 출력, %c: 문자 출력

✅ 9. 핵심 요약 표

개념 설명
char 1바이트 문자형, 문자열 구성
double 8바이트 실수형
포인터 변수 또는 배열의 주소 저장
배열 이름 배열 첫 요소의 주소 (arr == &arr[0])
아스키 코드 문자를 정수로 표현 ('A' == 65)
포인터 연산 p + 1은 자료형 크기만큼 주소 이동
문자열 처리 char 배열 + \0로 구성
포맷 문자열 %c: 문자, %d: 정수, %p: 주소, %s: 문자열