16강 2:17

char *ptr_a=a;
int *ptr_b=b;
왜 위와 같이 배열의 주소를 a, b로 선언한건지? 선언을 해야 하는건지? 이해가 안 가요
저렇게 되면 ptr_a의 메모리 주소는 a, ptr_b의 메모리 주소는 b가 되는거니까 출력할때 각각 a,b가 나올 줄 알았는데, 배열의 첫번째 요소로 되니까 헷갈려요ㅠ
Answer 2
0
안녕하세요, 그건 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
안녕하세요, 인프런 AI 인턴입니다. 가보자고님.
질문해주신 C 언어의 포인터와 배열 주소 관계에 대해 풀어서 설명드릴게요.
포인터와 배열의 관계:
- 배열의 이름(예:
a또는b)은 배열의 첫 번째 요소의 주소를 나타냅니다. 즉,char *ptr_a = a;라는 선언은ptr_a를 배열a의 첫 번째 요소를 가리키도록 합니다.
- 이런 식으로
int *ptr_b = b;도 배열b의 첫 번째 요소를 가리킵니다.
- 배열의 이름(예:
포인터 사용의 의미:
- 포인터
ptr_a또는ptr_b가 배열의 첫 번째 요소를 가리키기 때문에,*ptr_a나*ptr_b로 접근하면 첫 번째 요소의 값을 가져옵니다.
- 이를 통해 포인터 연산을 하면 포인터가 다음 요소를 가리키도록 위치가 이동하면서 배열의 다른 요소들에 쉽게 접근할 수 있습니다.
- 포인터
포인터 증감 연산:
- 포인터를 증가시키면
ptr_a++또는ptr_b++와 같이 포인터가 다음 요소의 주소로 이동하게 됩니다. 예를 들면,ptr_a가 초기에는a[0]을 가리켰다면,ptr_a++후에는a[1]의 요소를 가리키게 됩니다.
- 따라서
printf("%c\n", *ptr_a);와 같이 사용하면 현재 위치의 요소 값을 출력합니다.
- 포인터를 증가시키면
피해야 할 혼동:
- ptr_a와 ptr_b 자체는 주소를 보관하지만, *ptr_a와 *ptr_b는 각각 그 주소의 실제 값을 가져오는 것입니다.
- 잘못된 출력 결과는 포인터가 가리키는 위치를 이해하지 못했을 때 발생할 수 있습니다.
관련 자료 및 비슷한 경우에 대한 추가 설명은 다음 링크를 참고하세요:
- 포인터와 배열의 관계 이해하기
- 배열의 첫 번째 인덱스 이해
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
파이썬 학습자료가 강의 자료와 다릅니다.
0
18
3
섹션 2 - 9강 강의자료 다운로드 문제
0
11
2
29강 3:09
0
12
2
28강 6:42
0
11
2
22강 17:33
0
17
2
75강 26년 1회 코드 문제 해석 강의 질문 드립니다.
0
18
2
모의고사
0
23
1
17강 28:26
0
18
2
C언어 기출문제 변형에서 6번 문제입니다. 20:56
0
17
3
17강 22:38
0
22
2
부모 및 자식 생성자 출력 관련
0
31
2
부모 및 자식 생성자 출력
0
26
2
9강 35분경 질문있습니다
0
31
2
11강 3:20
0
37
2
10강 11:42
0
39
2
9강 26:23
0
48
2
9강 23:46
0
39
2
코드 중간에 . 붙은건 뭐라고 봐야할까요?
0
55
2
설명중 단어 의미 해석 문제.
0
38
1
수강 섹션마다 옆에 자료 다운로드 버튼이 있는데. 다운받으면 무슨내용이 있는건가요?
0
35
1
SQL 집중학습
0
42
1
NULL과 0
0
48
2
26년 1회 기출문제 11번 질문드립니다
0
49
1
업캐스팅 문제예시5 & 업캐스팅 문제 예시 6
0
46
2

