Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[1174] 이번엔 배열입니다.
김인구.구야 [whileone] 1414 읽음    2002-09-13 01:13
일반적인 배열의 정의 : 연속된 공간에 할당된 동일 자료형의 집합
C 에서의 배열의 정의 : int a[5]; => int형 기억장소 5개를 연속적으로 확보하고
그것의 '시작주소'를 a 라는 '상수 성격'의 이름을 부여하여 관리

C의 관점에서 본 a[3] 과 *(a+3)
C는 a[3]을 *(a+3)으로 바꿔서 컴파일 한다고 합니다.
첨자가 1부터 시작하는 언어에서는 a[3]을 "a 배열의 3번째 방"이라고 해석하고(원래 뜻 그대로)
베이스가 0부터인 C는 a[3]을 *(a+3)으로 바꾸고 "a주소에서 3만큼 떨어진 주소의 방"이라고 해석을 합니다.
베이스가 1부터인 언어에서 a는 배열 전체를 의미합니다.
하지만 C에서 a는 배열 전체를 의미하는게 아니라 그 배열이 시작되는 주소를 의미합니다.
베이스가 1인 언어에서는 a[-1] 이나 a[9]를 "a배열의 -1번째 방, a배열의 9번째 방"이라고 해석을하니까
당연히 a라는 배열에 없는 방이니 컴파일 에러가 난다고 합니다.(제가 다른 언어를 확인은 못해봤습니다.)
그러나 C에서는 "a주소에서 -1만큼 떨어진 주소의 방, a주소에서 +9만큼 떨어진 주소의 방"으로 해석을
하고 거기에 메모리(주소)가 있으니 컴파일 에러를 낼 이유가 없는것이죠.
물론 나중에 문제가 생기는건 프로그래머가 책임을 지라고 하는게 C언어구요.
C 배열의 첨자가 0부터 시작하는 이유가 바로 a가 배열전체를 의미하는게 아니라 시작주소이기 때문이라는 군요.

그럼 a[3]은 뭔가...
일반적인 배열의 의미로 이런 표현법을 쓰고 다른 언어가 이렇게 많이 쓰니까 C에서도 이런 '표기법'을
제공하는거라고 합니다. (음....전 이부분이 좀... 각자 판단하세요. '표기법 제공'은 그런거 같습니다만...)
a[3]이 실제로 C에서는 4번째 방이 됩니다.
벌써 일반적인 배열의 의미인 3번째 방이란 의미를 상실해버렸습니다.
"a배열의 3번째방"이라는 자연스러운 표현을 그대로 사용한다면 a[0]을 어떻게 해석해야 할까요.
"a배열의 0번째방"... 은 벌써 자연스러운 표현을 벗어난듯합니다.
0번째 방이 실제로 존재할 수 없으니까요.
C에선 a[0]을 "a주소에서 0번째 떨어진 주소의 방" 다시말해 "a주소에서 전혀 떨어지지 않은 주소의 방"이라고 해석을 합니다.
물론 *(a+0)으로 바꾼후에 해석이 가능하다는 논리죠.
이렇게 본다면 C에선 a[n]이라는 표현자체의 의미를 그대로 살릴수가 없으니 이런 표현 자체가 적합하지 않다고 봅니다.
그래서 C에선 a[0]을 *(a+0)으로 바꿔서 위와 같이 해석을 하는것이죠.
엄밀히 따진다면 a[n]은 C에 맞지않는 표현인거 같습니다. (이것은 저는 동의하는 입장입니다.)

포인터 연산에서 주소+주소가 안되는 이유는...
주소+정수, 주소-정수, 주소-주소는 연산결과가 어떤 의미를 가질 수 있기 때문에
C언어(컴파일러) 자체에서 연산을 정의해놓고 있습니다.
이말은 주소+주소의 연산 결과가 어떤 의미를 가질수 있다면 컴파일러가 연산법을 제공하면 쓸수 있다는 말이죠.
주소+정수 : 그 주소에서 정수만큼 떨어진 주소
주소-정수 : 그 주소에서 -정수만큼 떨어진 주소
주소-주소 : 주소와 주소사이에 얼마만큼의 기억 공간이 있는가
주소+정수나 주소-정수는 주소이고 주소-주소는 정수라는 말이 이말인거 같습니다.

그럼 주소+주소를 하면 그 값은 정말 의미가 없는걸까?
2층3호 - 2층8호 라면 그 사이에 몇 집이 있다는(차) 의미를 만들수 있지만
2층3호 + 2층8호 라면...?? (어떤 의미를 만들어 볼려고 하고 있는데 전 아직 못 만들었습니다.)
만약 어떤 의미를 부여할수 있다고 하더라도 아마 프로그래밍에서는 의미가 없을꺼 같습니다.
의미가 있다면 그 똑똑한 C를 만든사람들이 주소+주소 연산을 정의했을꺼라 생각하거든요...

나름대로 이해를 하고 정리를 해서 글을 올렸습니다만
걱정이 앞섭니다.
약간의 단어선택 표현의 차이로 다르게 해석이 가능한 부분이니까요.
리플 부탁드립니다.

+ -

관련 글 리스트
1174 이번엔 배열입니다. 김인구.구야 1414 2002/09/13
3572     Re:이번엔 배열입니다. 정재훈 1461 2002/09/17
3571     Re:이번엔 배열입니다. 정재훈 1449 2002/09/17
1179     사고방식을 바꾸세요! 김백일 1480 2002/09/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.