해결된 질문
작성
·
136
답변 1
0
p = a;
이 부분이 빈 값(null)에서 a를 가리키라고 엎어친 것입니다.
코드를 순서대로 이해하실 수 있게 현실에 비유해보겠습니다.
null은 그냥 없다고 생각하신다고 하면,
포인터 변수(p)를 손가락이라고 생각해봅시다.
저는 지금 제 손가락을 가위모양으로 만들었습니다. 무언가를 가리키려고 합니다. (char *p) - 포인터 변수 탄생만 시켰다는 뜻. 정확히 말하면 방금 만든 손가락은 "char" 형태의 데이터만 가리킬 수 있게 만든 것임.
근데 일단 허공을 가리키고 싶습니다. ( = NULL)
안 가리켜도 되지 않냐고요? (그냥 char *p;만 선언) 네, 그래도 됩니다.
그런데 허공을 가리켜도 되죠. 개발자가 코드를 작성하는 마음대로 할 수 있습니다.
저기에 문자열 a가 탄생해있습니다. (char a[] = "Art";)
허공을 가리키고 있는 손가락으로 a를 가리키라고 명령합니다. ( p = a );
→ (여기서 질문)
Q. 왜 a의 주소를 넘겨줘야하는데 &a라고 안하고 그냥 a로 주나요?
A. C언어에서는 배열과 문자열은 이름 그 자체가 주소처럼 행동합니다. 이건 C언어의 문법 스펙이라 강제로 암기가 필요한 부분.
(결론) 자, 이제부터 제 손가락은 a의 첫부분을 가리키고 있습니다.
이해에 도움이 되셨을까요?
#include <stdio.h>
int main() {
char a[] = "Art";
char* p = a;
printf("%c\n", *p); // A
return 0;
}
(*p) 정답은 %c로 출력했다는 가정에서 'A'. 포인터는 배열 맨 앞의 주소를 가리키고 있음
#include <stdio.h>
int main() {
char a[] = "Art";
printf("%c\n", *a); // A
return 0;
}
위의 경우는 배열의 주소(배열 이름은 곧 주소처럼 취급가능)의 값이니 첫 글자인 A만 출력
#include <stdio.h>
int main() {
char a[] = "Art";
printf("%s\n", a); // Art
return 0;
}
(출력문에 들어가는 변수값에 * 별 없음 주의. 없어야 제대로 실행됨)
이 경우에는 메모리 주소를 주면서 %s로 출력하라고 해서 "Art" 전체가 출력.
*a, *p, a[0]
문자열도 배열로 선언하기 때문에 배열처럼 인덱스로 접근하여 출력할 수 있습니다. (단, %c 형태로 출력 필요)
이것은 그냥 받아들이고 외우는 것이 좋습니다.
감사합니다.