16강 2:17

char *ptr_a=a;
int *ptr_b=b;
왜 위와 같이 배열의 주소를 a, b로 선언한건지? 선언을 해야 하는건지? 이해가 안 가요
저렇게 되면 ptr_a의 메모리 주소는 a, ptr_b의 메모리 주소는 b가 되는거니까 출력할때 각각 a,b가 나올 줄 알았는데, 배열의 첫번째 요소로 되니까 헷갈려요ㅠ
답변 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
6
1
부모 및 자식 생성자 출력
0
6
2
9강 35분경 질문있습니다
0
21
2
11강 3:20
0
22
2
10강 11:42
0
20
2
9강 26:23
0
30
2
9강 23:46
0
26
2
코드 중간에 . 붙은건 뭐라고 봐야할까요?
0
36
2
설명중 단어 의미 해석 문제.
0
25
1
수강 섹션마다 옆에 자료 다운로드 버튼이 있는데. 다운받으면 무슨내용이 있는건가요?
0
20
1
SQL 집중학습
0
40
1
NULL과 0
0
40
2
26년 1회 기출문제 11번 질문드립니다
0
43
1
업캐스팅 문제예시5 & 업캐스팅 문제 예시 6
0
43
2
V1.2 VS V.091
0
48
2
split('T')일때는 T만 제거되는거고 공백은 제거되지 않는 건가요?
0
50
2
파이썬 언어 업데이트, 언어별 학습자료 업데이트
0
48
2
C, java, python 언어 기출문제 강의 질문
0
52
2
1:26 에서 반복문 i[1] 이니까 0 다음 두번째 항목들 아닌가요
0
49
2
d
0
45
2
출력값
0
43
2
(기출) 2023년 3회 코드해석 문제의 1:10입니다.
0
50
2
23년도 2회 c언어 0:03 n[(i+6)%5] 도 가능한건가요?
0
50
2
정처기 질문
0
53
2





