C

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

1space 2025. 6. 14. 23:11

 

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