inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

홍정모의 따라하며 배우는 C언어

10.9 포인터 연산 총정리

포인터 산술연산 질문

306

장준모

작성한 질문수 7

1

int main()

{

int arr[5] = { 1,2,3,4,5 };

int* ptr1, * ptr2, * ptr3;

ptr1 = arr;

ptr3 = ptr1 + 4;

        printf("%p, %d %p\n", ptr3, *ptr3, &ptr3);

return 0;

}

위 코드에서 ptr3 = ptr1 + 4 라는 점이 제가 이해하기로는

ptr3이 ptr1의 첫번째 주소에서 (int 크기만큼) 4칸 이동한 주소이다 라고 이해했습니다

그래서 ptr3[0]이나 *ptr3을 출력해보았을때 5가 나오고

ptr3[1]이나 ptr3[2] 등을 출력해보면 쓰레기값이 나왔습니다

여기서 궁금한점이 ptr1은 배열의 형식을 갖고있는데

ptr3도 배열의 형식을 갖고있는지가 궁금합니다

단순히 ptr1 + 4의 주소만 받은건지 아니면 배열의 형식도 같이 받은건지 궁금합니다

c

답변 2

4

안소

안녕하세요.

사실 배열인 arr이나 포인터인 ptr1, ptr3이나 모두 어떤 배열의 형식을 가지고 있는게 아닙니다. 배열이름인 arr 에조차도 오로지 주소만 저장이 되어 있어요! 그리고 사실 arr도 주소값을 변경할 수 없는 상수 '포인터'나 마찬가지입니다.

arr, ptr1, ptr3 모두 다 주소값을 저장하는 포인터 '변수'일 뿐입니다. 

배열이름 뿐만 아니라 모든 포인터는 [] 연산자를 사용할 수 있습니다.(int, double같은 기본 자료형의 포인터 한정) ptr[3] 연산은 곧 *(ptr + 3)이나 마찬가지입니다. 즉 ptr이 가지고 있는 주소에서 3 칸 더 떨어진 주소에 있는 데이터를 의미하는 것이나 마찬가지입니다. 사실 배열 이름도 포인터이니 당연하겠죠!  

arr도 데이터 1이 있는 곳의 주소를 가지고 있을 뿐이고, ptr1도 arr의 주소 즉 데이터 1이 있는 곳의 주소를 가지고 있을 뿐이고, ptr3은 ptr1 + 4 즉 ptr1이 가리키는 곳에서 4 칸 떨어져있는 곳의 주소를 가질 뿐입니다. 

- arr은 첫번째 원소인 1 의 주소를 담고 있습니다.(arr + 0) 그뿐입니다. arr은 1 데이터가 있는 메모리의 주소를 가지고 있는 상수 포인터일 뿐입니다. '배열'이라는 자료구조는 모든 원소들이 메모리상에서 바로 이웃사이로 따닥따닥 다 붙어서 자리잡습니다. 그래서 arr[0] ~ arr[4] 으로 1,2,3,4,5 데이터들에 바로바로 접근할 수 있게 됩니다. 다 이웃 사이로 붙어서 자리잡고 있기 때문입니다. arr[5]부터는 배열의 범위를 벗어난 곳에 접근하는 것이니 쓰레기값이 나오겠지만요! arr[3]은 arr + 3 주소에 있는 데이터와 동일합니다.

- ptr은 arr[3]의 주소를 대입받았습니다. 즉 ptr은  arr + 3 주소에 있는 데이터인 4 가 있는 메모리의 주소를 받았습니다. ptr은 4 데이터가 있는 공간의 주소를 담고 있을 뿐이니다. 

- 그러니 ptr[1]은 즉, ptr은 현재 데이터인 4 가 있는 메모리의 주소를 담고 있으니 여기서 더 한칸 가면 데이터 5 가 있는 메모리의 주소겠지요. 그래서 ptr[1]은 데이터 5 가 있는 메모리 주소를 의미하게 됩니다. ptr + 1 이 된 것이나 마찬가지이기 떄문입니다. ptr[1]은 ptr + 1 주소에 있는 데이터와 동일합니다.

- ptr[3]은 ptr + 3 주소에 있는 데이터를 가져오는 것이나 마찬가지이므로 데이터인 4 가 있는 메모리의 주소에서 3 칸 더 떨어진 곳을 가리킵니다. 이는 arr배열의 범위를 벗어난 메모리 공간을 접근하는 것이므로 쓰레기값이 나온 것을 볼 수 있습니다.

0

장준모

명쾌히 해결 됐습니다 감사합니다!

완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.

1

50

3

main 함수에서 왜 int만 선언이 되는걸까요

1

54

2

8비트 2진수 변환시 왜 1을 더해야하나요?

1

53

2

혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?

1

47

1

프로토타입과 함수간의 인자 불일치

1

72

2

12.12 헤더 관련 질문

1

59

2

Visual Studio Community 2026 사용 문의

1

136

2

Q. 15:30, 부호가 있는 8비트 정수 질문

1

59

2

getchar(), putchar()

1

92

3

강의자리ㅛ

1

78

2

비주얼스튜디오코드로 공부해도 상관없나요?

1

112

2

소스파일안에 여러 파일

1

75

2

F5와 F7의 차이

1

75

2

c = TWO * (a+b); 에서 a와 b는?

1

58

2

; 세미콜론을 붙이는 기준에 문의

1

68

1

Step over 기능 문의

1

52

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

11.5 코드 구현

1

67

2