3분 15초 경에 제 생각이 맞는 건가요?
int arr[5] = { 100, 200, 300, 400, 500 };
int* ptr1, * ptr3;
ptr1 = arr;
ptr3 = ptr1 + 4;일 때
배열의 이름은 배열의 첫 번째 공간의 주소이다. 라고 한다면
ptr1은 arr[0]을 가리킨다.
ptr1 = arr
arr == &arr[0]
이라서 ptr1 + 4는 &arr[0] + (arr[0]의 자료형인 int의 크기) * 4 이고
배열의 이름은 배열의 첫 번째 공간의 주소를 가리키는 포인터와 비슷한 무언가이다. 라고 한다면
ptr1은 arr을 가리키고 arr은 arr[0]을 가리킨다.
ptr1 = &arr
&arr != &arr[0]
라서 ptr1은 arr[0]을 직접 가리키는 게 아니라 arr을 직접 가리키는거고
ptr1 + 4는 &arr + (arr의 자료형의 크기) * 4
인데 arr은 포인터와 비슷한거지 포인터가 아니라
주소도 없고 자료형도 없는데 여기서 뭔가 말이 모순되는 것 같고
계산 결과를 보면 후자는 절대로 아닌거 같은데
배열의 이름은 배열의 첫 번째 공간의 주소를 가리키는 포인터와 비슷한 무언가이다.
라는 표현은 맞는 표현 아닌가요?
맞는 표현인데도 불구하고 포인터와 비슷한 무언가라고 생각하고
ptr1 + 4를 하면 결과가 잘못되는 게 뭔가 아닌거 같아요.
제 생각의 어떤 부분이 뭐가 잘못된 거죠?
답변 1
3
안녕하세요, 답변 도우미 Soobak 입니다.
배열의 이름은 말씀하신대로 배열의 첫 번째 공간의 주소를 가리킵니다.
하지만, 배열의 이름이 실제 포인터 변수는 아닙니다.
배열의 이름은 포인터와 유사하게 작동하지만, 주소를 가리키는 상수 형태이며, 그 자체로 주소를 변경할 수 없습니다.
반면, 포인터 변수는 주소를 변경할 수 있습니다.
또한, 배열의 이름은 스스로 별도의 메모리 공간을 가지고 있지 않습니다.
질문해주신 코드에서, &arr 은 전체 배열의 주소를 나타내며, 타입은 int (*)[5] 입니다.
반면, &arr[0] 은 배열의 첫 번째 원소의 주소를 나타내며, 타입은 int* 입니다.
두 표현은 같은 메모리 위치를 가리키지만, 타입이 다릅니다.
이를 바탕으로 ptr1 + 4 포인터 연산을 했을 때, 해당 연산은 배열의 다섯 번째 요소(인덱스 4)의 주소를 가리키게 됩니다.
Export template 안됨
1
17
2
완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.
1
54
3
main 함수에서 왜 int만 선언이 되는걸까요
1
56
2
8비트 2진수 변환시 왜 1을 더해야하나요?
1
54
2
혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?
1
49
1
프로토타입과 함수간의 인자 불일치
1
73
2
12.12 헤더 관련 질문
1
60
2
Visual Studio Community 2026 사용 문의
1
137
2
Q. 15:30, 부호가 있는 8비트 정수 질문
1
61
2
getchar(), putchar()
1
93
3
강의자리ㅛ
1
79
2
비주얼스튜디오코드로 공부해도 상관없나요?
1
113
2
소스파일안에 여러 파일
1
75
2
F5와 F7의 차이
1
76
2
c = TWO * (a+b); 에서 a와 b는?
1
58
2
; 세미콜론을 붙이는 기준에 문의
1
68
1
Step over 기능 문의
1
53
2
2.6 강의 따옴표 출력 규칙 문의
1
74
2
int main 함수 관련 오류 문의
1
67
2
13.4 words[0]
0
60
2
11.7 함수를 구현해 봤습니다.
1
62
2
11.6 직접 strcmp와 strncmp를 구현해 보았습니다.
1
64
2
11.6 my_strcat과 my_strncat을 구현해봤습니다.
1
53
2
11.6 fit_str함수를 구현해 봤습니다.
1
53
2





