인프런 커뮤니티 질문&답변

김인도님의 프로필 이미지
김인도

작성한 질문수

(2025) 일주일만에 합격하는 정보처리기사 실기

(기출) 2023년 1회 코드해석 문제

포인터 주소값이 null?

해결된 질문

작성

·

132

0

  • 1000022740.jpg이해가 어려운 섹션이나 영상 설명은 질문으로 꼭 남겨주세요.
  • P의주소값이 null인데
  • P가 a(art)랑 같다는게
  • 이해가 안가네요.
  • 주소값이 없어도 값은 가질수있다는 뜻인가요?

답변 1

0

주말코딩님의 프로필 이미지
주말코딩
지식공유자

p = a;

이 부분이 빈 값(null)에서 a를 가리키라고 엎어친 것입니다.

 

코드를 순서대로 이해하실 수 있게 현실에 비유해보겠습니다.


 

null은 그냥 없다고 생각하신다고 하면,

포인터 변수(p)를 손가락이라고 생각해봅시다.

  1. 저는 지금 제 손가락을 가위모양으로 만들었습니다. 무언가를 가리키려고 합니다. (char *p) - 포인터 변수 탄생만 시켰다는 뜻. 정확히 말하면 방금 만든 손가락은 "char" 형태의 데이터만 가리킬 수 있게 만든 것임.

 

  1. 근데 일단 허공을 가리키고 싶습니다. ( = NULL)

안 가리켜도 되지 않냐고요? (그냥 char *p;만 선언) 네, 그래도 됩니다.

그런데 허공을 가리켜도 되죠. 개발자가 코드를 작성하는 마음대로 할 수 있습니다.


  1. 저기에 문자열 a가 탄생해있습니다. (char a[] = "Art";)

  2. 허공을 가리키고 있는 손가락으로 a를 가리키라고 명령합니다. ( p = a );

(여기서 질문)

Q. 왜 a의 주소를 넘겨줘야하는데 &a라고 안하고 그냥 a로 주나요?

A. C언어에서는 배열과 문자열은 이름 그 자체가 주소처럼 행동합니다. 이건 C언어의 문법 스펙이라 강제로 암기가 필요한 부분. 

 

  1. (결론) 자, 이제부터 제 손가락은 a의 첫부분을 가리키고 있습니다.

 

이해에 도움이 되셨을까요?

 

 



 

(미니퀴즈1) p의 값을 출력하면 뭘까?

#include <stdio.h>

int main() {
    char a[] = "Art";
    char* p = a;
    printf("%c\n", *p); // A
    return 0;
}

(*p) 정답은 %c로 출력했다는 가정에서 'A'. 포인터는 배열 맨 앞의 주소를 가리키고 있음

 

(미니퀴즈2) a의 값을 출력하면 어떻게 될까? %c와 %s일 때 다름.

#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" 전체가 출력.

 

(미니퀴즈3) A만 출력하는 3가지 방법을 얘기해라.

*a, *p, a[0]

문자열도 배열로 선언하기 때문에 배열처럼 인덱스로 접근하여 출력할 수 있습니다. (단, %c 형태로 출력 필요)

 

 

이것은 그냥 받아들이고 외우는 것이 좋습니다.

 

감사합니다.

 

김인도님의 프로필 이미지
김인도

작성한 질문수

질문하기