inflearn logo
강의

Course

Instructor

(2026 Latest!) Pass the Information Processing Engineer Practical Exam in just one week

Pointer Manipulation and Exam Patterns (2. Pointer Increment/Decrement, Double Pointers)

16강 2:17

Resolved

57

happwhy

24 asked

0

image.png

char *ptr_a=a;
int
*ptr_b=b;

왜 위와 같이 배열의 주소를 a, b로 선언한건지? 선언을 해야 하는건지? 이해가 안 가요

저렇게 되면 ptr_a의 메모리 주소는 a, ptr_b의 메모리 주소는 b가 되는거니까 출력할때 각각 a,b가 나올 줄 알았는데, 배열의 첫번째 요소로 되니까 헷갈려요ㅠ

python java c 정보처리기사 정보처리산업기사

Answer 2

0

weekendcode

안녕하세요, 그건 C언어의 스펙입니다. 어쩔 수 없이 외우셔야 하는 부분입니다.

C언어에서는 배열의 이름 그 자체를 주소로 사용할 수 있습니다. 그럴 경우, 첫 요소의 메모리 주소를 가리킵니다.


int a[5];처럼 배열을 선언하면, 이 a라는 이름은 일반 변수처럼 값을 담고 있는 게 아니라 배열이 시작하는 메모리 주소 그 자체를 의미합니다.


a를 그냥 쓰면 자동으로 &a[0] (배열의 첫 번째 요소의 주소)와 똑같은 뜻이 됩니다. 이건 C언어의 규칙입니다. "배열 이름은 배열의 첫 주소로 자동 변환된다"는 규칙이 있거든요.


그럼 왜 ptr_a = a라고 쓰나요?

포인터 변수를 선언할 때는 "이 포인터가 어떤 메모리 주소를 가리킬 것인가"를 알려줘야 해요. char *ptr_a = a;는 "ptr_a라는 포인터야, 너는 배열 a의 첫 번째 칸을 가리켜라"라는 뜻입니다.

여기서 a는 그냥 "배열 a가 시작하는 주소값"이라서, 이걸 포인터에 대입하면 ptr_a도 그 주소를 가리키게 되는 것뿐이에요. a라는 글자 자체가 저장되는 게 아닙니다.


왜 출력하면 "a"가 아니라 배열의 값이 나오나요?

값을 가져올 때 사용하는 것이 바로 *입니다. *ptr_a* 기호예요.

  • ptr_a (별표 없이) → 주소값 (숫자, 예: 0x7ffee...)

  • *ptr_a (별표 붙여서) → 그 주소에 저장된 실제 값을 꺼내오라는 뜻 (역참조, dereference)

printf("%c\n", *ptr_a);에서 *ptr_a는 "ptr_a가 가리키는 주소로 가서, 거기 저장된 값을 꺼내와라"라는 의미예요. 그 주소에 저장된 값이 배열의 첫 번째 요소값('H')이니까 'H'가 출력되는 거고요.



0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. 가보자고님.

질문해주신 C 언어의 포인터와 배열 주소 관계에 대해 풀어서 설명드릴게요.

  1. 포인터와 배열의 관계:

    • 배열의 이름(예: a 또는 b)은 배열의 첫 번째 요소의 주소를 나타냅니다. 즉, char *ptr_a = a;라는 선언은 ptr_a를 배열 a의 첫 번째 요소를 가리키도록 합니다.
    • 이런 식으로 int *ptr_b = b;도 배열 b의 첫 번째 요소를 가리킵니다.
  2. 포인터 사용의 의미:

    • 포인터 ptr_a 또는 ptr_b가 배열의 첫 번째 요소를 가리키기 때문에, *ptr_a*ptr_b로 접근하면 첫 번째 요소의 값을 가져옵니다.
    • 이를 통해 포인터 연산을 하면 포인터가 다음 요소를 가리키도록 위치가 이동하면서 배열의 다른 요소들에 쉽게 접근할 수 있습니다.
  3. 포인터 증감 연산:

    • 포인터를 증가시키면 ptr_a++ 또는 ptr_b++와 같이 포인터가 다음 요소의 주소로 이동하게 됩니다. 예를 들면, ptr_a가 초기에는 a[0]을 가리켰다면, ptr_a++ 후에는 a[1]의 요소를 가리키게 됩니다.
    • 따라서 printf("%c\n", *ptr_a);와 같이 사용하면 현재 위치의 요소 값을 출력합니다.

피해야 할 혼동:
- ptr_aptr_b 자체는 주소를 보관하지만, *ptr_a*ptr_b는 각각 그 주소의 실제 값을 가져오는 것입니다.
- 잘못된 출력 결과는 포인터가 가리키는 위치를 이해하지 못했을 때 발생할 수 있습니다.

관련 자료 및 비슷한 경우에 대한 추가 설명은 다음 링크를 참고하세요:
- 포인터와 배열의 관계 이해하기
- 배열의 첫 번째 인덱스 이해

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

조건 반복문 질문: for 문 ?

0

25

0

정처기 26-2회. 9번 질문드립니다!

0

51

1

이론 보면서 질문이 있습니다.

0

60

2

정보처리기사 실기 26년 2회 SRT 스케줄링 문제 단위 질문

0

61

2

유튜브(정보처리기사 실기 | 26년 2회 기출문제 코드 해설)

0

77

2

262 정처기 실기 C언어코딩

0

33

1

정보처리기사 262 실기 Hash(해시) 질문

0

64

2

static 변수 질문입니다.

0

47

2

파이썬 4강 질문입니다.

0

59

2

모의고사 1회 3번문제

0

76

3

41강 30:10

0

53

2

이론 공부법 질문 있습니다.

0

79

2

부모의 생성자 관련 질문

0

54

2

시험지 문제에 필기해도 되나요?

0

69

3

41강 11:23

0

49

2

4강파이썬 질문입니다

0

47

2

try-catch 핸들러명

0

58

2

36강 3:48

0

58

2

35강 18:27

0

55

2

자식 코드 내 super() 생략

0

51

2

출력질문

0

67

2

31강 4:06

0

57

2

파이썬 학습자료가 강의 자료와 다릅니다.

0

85

3

섹션 2 - 9강 강의자료 다운로드 문제

0

70

3