13분 40초
4
2 asked
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;도 해봤는데 에러가 나던데 그 이유는 무엇입니까?
Answer 1
0
안녕하세요, 인프런 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_b는 char ** 타입인데 str2는 배열 이름이므로 char *로 변환됩니다. 즉, char ** 변수에 char * 값을 대입하려 하므로 타입이 맞지 않습니다.
**ptr_b = str2;
**ptr_b는 char 타입입니다. 반면 str2는 char * 타입이므로 문자 변수에 주소를 대입하려는 형태가 되어 오류가 발생합니다. 특정 문자를 바꾸려면 다음처럼 문자 하나를 대입해야 합니다.
**ptr_b = 'W';
다만 이 경우 ptr_a가 str2를 가리키고 있다면 str2[0]이 'W'로 변경됩니다.
관련하여 이중 포인터에서 역참조할 때 값이 주소가 될 수 있는 이유는 아래 기존 답변에서 단계별로 설명하고 있습니다.
이 답변에서는 ptr_b가 char **, *ptr_b가 char *, **ptr_b가 char가 되는 과정을 설명하고 있어 질문하신 코드의 동작을 이해하는 데 도움이 됩니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
정보처리기사 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

