inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

독하게 시작하는 C 프로그래밍

포인터와 1차원 배열

포인터와 배열의 이름의 차이가 궁금합니다.

해결된 질문

346

이이이이잉잉이

작성한 질문수 4

1

상수 포인터와 배열의 이름은 유사한 개념이라고 파악하고 있었는데, sizeof(배열의 이름)은 배열의 크기를 출력해준다는 점에서 약간의 차이가 있다는 점을 알게 되었습니다.

또한, 참조 연산자를 통한 결과 또한 포인터의 경우, 메모리를 확인한 결과 해당 주솟값을 가리키고 있는 다른 주소의 값을 가지고 있었지만, 배열의 이름은 동일한 주솟값이 결과로 나오는 것을 확인할 수 있었습니다.

제가 이해한 바로는 배열의 이름 자체는 배열의 시작 주소이기에 'test2' 는 'H'라는 배열의 시작 주소를 가리키고, '&test2'는 "Hello World"라는 배열 자체 주소를 가리키는 것이라고 판단을 했는데, 이것이 맞는 이해인지 궁금합니다.
두 개념이 비슷하지만 약간의 차이가 있는 것 같은데 이 차이에 대해서 설명해주시면 감사하겠습니다.

c 컴퓨터-구조 assembly-language vc++

답변 1

1

널널한 개발자

우선 저 대신 답변도 해주셔서 고맙다는 인사부터 드립니다. 😄

test2는 char[12] 배열에 부여한 이름이며 그 자체가 메모리의 주소입니다. 따라서 'H'라는 배열의 시작 주소가 아니라 'H'가 저장된 메모리의 주소입니다. 그리고 &test2는 char[12] 배열에 대한 주소 입니다. 이 주소에 +1을 하면 char[12]만큼 증가 합니다. 다차원 배열 연산을 풀어쓸 때 이러한 이슈를 경험할 수 있습니다.

&test2가 "Hello World\0"이 저장된 메모리의 주소인 것은 맞습니다. 그러나 자료형이 char[12]라는 사실을 잊어선 안 됩니다! 다음 코드의 실행 결과를 확인해보시기 바랍니다. 좋은 공부가 될 것입니다.

 

	char test2[] = { "Hello World" };
	printf("%zd\n", sizeof(test2));
	printf("%zd\n", sizeof(*(&test2 + 1)));

 

그리고 2차원 배열을 간접지정 연산자 및 덧셈 연산으로 풀어써보기 바랍니다. 그러면 모두 이해될 것입니다. 😄

scanf("%d\n") 의미

0

20

1

주소 연산자(&) 간접 지정자(*) 반대 개념

0

33

1

Virtual Memory, Memory, Memory mapping tables

0

51

1

샘플코드 출력 오류 발생 질문드립니다

0

63

2

값의 교환에 사용되는 변수의 위치.

0

88

2

메모리 비교에 관한 질문

0

81

2

문자열 Null

0

63

1

C, C++

0

88

2

문자열 입출력 코드 에러

0

60

2

선생님! 120화 2분 50초 질문입니다.

0

67

1

caller 가 메모리 할당 해제를 할 때의 문제점 질문

0

64

2

단축키 맞는지 여부 문의드립니다.

0

60

2

문자열을 사용하는 이중 포인터에 대하여 질문합니다

0

66

1

char 포인터 변수의 크기에 대하여 제가 이해한 것이 맞을까요

0

78

2

용어 설명 필요

0

57

2

stdin, stdout

0

71

2

필수 실습 (최댓값을 반환하는 함수)

0

93

2

아......ㅠㅠ

0

100

2

버퍼 내 엔터

0

72

1

2진수 뺄셈에서 carry-out

0

112

2

union 식별자는 실무에서 보통 어디에서 사용하나요?

0

80

2

필수실습문제 공부법 (진도 vs 복습)

0

104

2

예제파일 다운로드

0

79

2

Visial Studio Code 를 설치해서 사용해도 수업을 따라가는데 지장이 있나요?

0

120

3