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 + 1
은 sizeof(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
char
↔ int
간 변환 가능 (범위 주의)
%d
: 정수 출력, %c
: 문자 출력
✅ 9. 핵심 요약 표
개념 |
설명 |
char |
1바이트 문자형, 문자열 구성 |
double |
8바이트 실수형 |
포인터 |
변수 또는 배열의 주소 저장 |
배열 이름 |
배열 첫 요소의 주소 (arr == &arr[0] ) |
아스키 코드 |
문자를 정수로 표현 ('A' == 65 ) |
포인터 연산 |
p + 1 은 자료형 크기만큼 주소 이동 |
문자열 처리 |
char 배열 + \0 로 구성 |
포맷 문자열 |
%c : 문자, %d : 정수, %p : 주소, %s : 문자열 |