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' 'a' 'n' 'g' 'e' '\0'
포인터 연산과 출력
✔ printf("%s", p[0]);
p[0]은 "apple"의 주소이므로, printf("%s", p[0])는 "apple"이 출력됩니다.
✔ printf("%s", p[0] + 1); → pple
p[0] + 1은 "apple"의 두 번째 글자 'p'의 주소입니다. 그래서 "pple" 출력됩니다.
✔ p[0][3]
p[0]이 "apple"이고, p[0][3]은 'l'입니다.
📌 이건 배열 표기법이지만 사실상 이중 포인터 표현입니다.
p[0][3] ≡ *(*(p + 0) + 3)
✔ *(p[0] + 1) → 'p'
→ "apple"에서 두 번째 글자
✔ *(p[0] + 3) = 'l'
이건 오른쪽 위 수식과 완전히 일치합니다.
→ p[0][3] = 'l' = *(p[0] + 3)
✔ p[2]는 "orange"의 주소
즉, p[2] == "orange"입니다.
✔ *p[2]는 "orange"의 첫 글자 → 'o'
이것은 문자 하나, 즉 char
표현 | 의미 |
p[i] | i번째 문자열의 시작주소 (포인터) |
p[i][j] | i번째 문자열의 j번째 글자 (char) |
*(p[i] + j) | 위와 같은 의미 (역참조 방식) |
printf("%s", p[i]) | 문자열 전체 출력 |
printf("%s", p[i] + 1) | i번째 문자열의 두 번째 문자부터 출력 |
'C' 카테고리의 다른 글
구조체란? (0) | 2025.06.15 |
---|---|
문자열 상수를 const char*에 저장하는 이유 (0) | 2025.06.15 |
문자열을 배열로 처리할 때 주의할점 (0) | 2025.06.14 |
배열 vs 포인터 : 문자열처리 (0) | 2025.06.14 |
문자열 상수 (0) | 2025.06.14 |