inflearn logo
강의

Course

Instructor

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

Pointer Manipulation and Question Patterns (2. Incrementing/Decrementing Pointers, Double Pointers)

13분 40초

4

Dann

2 asked

0

char str2[] = "World";
*ptr_b = str2;
printf("%c\n", ptr_a[1]);

이부분은 이해가 계속 안되고 있어서 질문을 드립니다.

앞에서 **ptr_b = &ptr_a;를 했기 때문에
ptr_b가 가지고 있는 값은 ptr_a의 주소입니다. 그래서 만약 ptr_a의 주소가 30000이면 ptr_b의 값은 30000이 저장되고 즉, ptr_b가 ptr_a를 가리키게 되는 것입니다.

그 상태에서

*ptr_b = str2;를 하게되면 ptr_b가 가르키는 주소는 ptr_a이고 그 값은 기존 'H'가 있는 1001이 저장되어 있었지만 갱신되어서 'W'의 주소값이 ptr_a에 저장된다고 이해를 했습니다.

근데 어떻게 *ptr_b = str2;를 했는데 *ptr_b의 값인 30000이 'W'의 주소값으로 바뀌는게 아니고 ptr_b가 가리키고 있는 주소인 ptr_a의 값인 'H'가 'W'로 바뀌는 것입니까?

그리고 *ptr_b = str2; 말고
ptr_b = str2;과 **ptr_b = str2;도 해봤는데 에러가 나던데 그 이유는 무엇입니까?

c 정보처리기사

Answer 1

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. Dann님.

질문하신 내용은 char **ptr_b = &ptr_a; 상태에서 이중 포인터를 역참조하는 과정과 관련되어 있습니다.

예를 들어 다음과 같이 선언되어 있다고 가정하겠습니다.

char str[] = "Hello";
char *ptr_a = str;
char **ptr_b = &ptr_a;

char str2[] = "World";
*ptr_b = str2;

각 변수의 관계는 다음과 같습니다.

ptr_a  : str의 시작 주소
ptr_b  : ptr_a의 주소
*ptr_b : ptr_a의 값, 즉 str의 시작 주소

따라서 *ptr_b = str2;는 다음과 같은 의미입니다.

ptr_a = str2;

즉, *ptr_b가 가지고 있던 값인 str의 주소가 str2의 시작 주소로 변경되고, 결과적으로 ptr_a"World"를 가리키게 됩니다.

중요한 점은 "H" 자체가 "W"로 바뀌는 것이 아니라는 것입니다.

printf("%c\n", ptr_a[1]);

실행 시 ptr_a가 이제 str2를 가리키므로 ptr_a[1]"World"의 두 번째 문자 'o'를 출력합니다. 기존 str 배열의 "Hello""World"로 수정되는 것은 아닙니다. 단지 ptr_a가 가리키는 대상이 str에서 str2로 변경된 것입니다.

각 표현식의 타입도 함께 보면 이해하기 쉽습니다.

ptr_b       // char **
*ptr_b      // char *
**ptr_b     // char

따라서 대입은 다음처럼 타입이 맞아야 합니다.

*ptr_b = str2;    // char* = char*  → 정상

반면 다음 코드는 타입이 맞지 않습니다.

ptr_b = str2;

ptr_bchar ** 타입인데 str2는 배열 이름이므로 char *로 변환됩니다. 즉, char ** 변수에 char * 값을 대입하려 하므로 타입이 맞지 않습니다.

**ptr_b = str2;

**ptr_bchar 타입입니다. 반면 str2char * 타입이므로 문자 변수에 주소를 대입하려는 형태가 되어 오류가 발생합니다. 특정 문자를 바꾸려면 다음처럼 문자 하나를 대입해야 합니다.

**ptr_b = 'W';

다만 이 경우 ptr_astr2를 가리키고 있다면 str2[0]'W'로 변경됩니다.

관련하여 이중 포인터에서 역참조할 때 값이 주소가 될 수 있는 이유는 아래 기존 답변에서 단계별로 설명하고 있습니다.

이 답변에서는 ptr_bchar **, *ptr_bchar *, **ptr_bchar가 되는 과정을 설명하고 있어 질문하신 코드의 동작을 이해하는 데 도움이 됩니다.

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

정보처리기사 26년 실기 2회 네트워크 부분

0

16

2

기출문제 재탕

0

48

1

뻬먹은 코드

0

32

1

기출문제 재탕

0

26

0

모의고사1회 2번문제 뭔지 모르겠네요 강의올려주시면안될까요?

0

34

1

영상 다운로드는 안되나요?

0

66

1

26년2회 실기기출은 언제쯤...

0

114

2

이론 공부법 요약본 버전 업데이트 문의

0

86

2

정처기 필기 준비할때 이 이론을 다시 외워도 될까요?

0

98

2

조건 반복문 질문: for 문 ?

0

85

1

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

0

106

1

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

0

92

2

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

0

113

2

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

0

189

2

262 정처기 실기 C언어코딩

0

72

1

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

0

101

2

static 변수 질문입니다.

0

69

2

파이썬 4강 질문입니다.

0

77

2

모의고사 1회 3번문제

0

104

3

41강 30:10

0

76

2

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

0

105

2

부모의 생성자 관련 질문

0

74

2

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

0

103

3

41강 11:23

0

65

2