다차원 배열의 이름에 대해 궁금한 점이 있습니다.
황예
질문 제목 :
다차원 배열의 이름에 대해 궁금한 점이 있습니다.배열의 이름이 가지는 주소는 왜 해당 값을 가리키지 못하나요?
질문 내용 :
언제나 답변해주시는 분이 계셔서 기쁩니다 ^^
오늘은 열혈강의 C 포인터 3장 배열부분을 공부하고 있습니다 ^^
정말 도움을 많이 받아서 즐겁게 하고 있습니다 ㅎ
오늘도 공부하다 궁금한 점이 생겨서 이렇게 질문을 합니다
밑에 전반부 글은 제가 메모장에 개인적으로 생각을 정리하면서 고민하던중에 쓰던것을 그대로 복사해온 것이라 앞뒤도 안 맞고 다소 언어가 반말투인것 죄송합니다. 제 생각이 어떤식으로 진행됐는지 아시면 답변해주시는게 더 편하실거 같아서 올렸습니다
죄송합니다 ^^;
배열에서 이름은 전부 첫 시작 주소를 가리킨다
따라서 여기에 가감산 연산을 하면 해당 자료형의 크기만큼 늘어나거나 줄어든다
여기서 해당 자료형은 기본 크기만 될뿐 차원에 따라 배열의 가감산연산에서 크기는 달라진다
예를 들어 2차원 배열이 있다면
int nop[3][3] 배열이 있다
이 배열의 첫 시작 주소는 nop 이다
nop+1은 3*4byte의 크기만큼 늘어난다
하나의 구역을 넘어 간다는 이해하면 되겠다
그리고 nop[3][0]+1은 4byte의 크기만큼 늘어난다
nop[3]의 영역에 와서 그곳에 있는 수들을 찾는 것이다.
다시 처음으로 돌아와서
nop[3][3]과 nop[9]는 그 맥락이 같다
둘다 메모리는 36byte를 차지하며 그 주소가 배정되는 것도 똑같다
다만 전자는 어느 블록을 만들어 지정한다고 할수 있는 인덱스 기능을 넣은 것이다
여기서 *는 메모리에 있는 값을 가리킨다고 했다
여기서 이 *을 차원 배열 앞에 붙이면? 하위 계열인 구역을 가리키게 되는 것이다.
즉 어딘가에 메모리 주소가 있다는 소리?
자 다시 정리하자
nop[3][3]은 2차원 배열이다 nop[9]은 1차원 배열이다 *을 넣으면 직접 엑세스가 가능하다
2차원 배열은*을 하면 해당 차원의 하위 차원의 주소가 나온다
이 차원에 배정되는 메모리 외에 다른 곳에 이 주소가 저장되는 것이다?
마치 색인처럼 말이다
#include stdio.h
void main(){
int nop[3][3]={1,2,3,4,5,6,7,8,9};
printf(%x\n,nop[0]);
printf(%x\n,nop);
printf(%x\n,nop[1]);//12byte 씩 건너 뜀
printf(%x\n,nop+1);
printf(%x\n,nop[2]);//12byte 씩 건너 뜀
printf(%x\n,nop+2);
printf(%x\n,*(nop[0]));//해당 주소에 있는 값을 출력
printf(%x\n,*(nop));//주소에 있는 값을 출력하지 못함
printf(%x\n,*(nop[0]));
printf(%x\n,*(nop[0]+1));
printf(%x\n,*(nop[0]+2));
}
결과가 이렇게 나왔습니다.
nop와 nop[0]의 주소 값이 같으니까
1장에서 설명된 것처럼 *이것을 붙이면 메모리에 저장되 있는 값이 나올 것이다 라고 생각했는데
그렇지 않았습니다.
그래서 내린 결론이 차원 배열을 하면 또 다른 메모리 공간에 해당 주소를 저장한다 마치 색인을 메모리에 저장해서 뽑아오는 것처럼 말이다 이것입니다.
이게 맞다면 메모리 낭비하는 것 아닌가? 라는 생각도 들었습니다.
하지만, 확실치도 않고 무엇인가 자꾸 놓치고 있다는 생각이 들어 이렇게 또 질문을 합니다.
제 생각중 잘못된 점과 궁금한 점을 해결해주세요^^
언제나 답변해주시는 분들 정말 감사합니다 ^^
-
카제
그냥 책에 있는 그대로 써볼께요.
a==&a[0] 과 *a==a[0] 은 비교가 허용되지만, 강제적인 타입 변환 없이는 &a==&a[0]은 허용이 되지 않는다. &a와 &a[0] 모두 대부분의 구현체에서 같은 값을 가질 가능성은 크지만 같은 타입이 아님을 꼭 기억해야 한다. &a를 사용하는 문맥과 &a[0]을 사용하는 문맥은 반드시 구분해야 한다.
C:A Reference Manual 205페이지 주석 에 나와있는 내용입니다.
질문자의 글에서는
-
목화
두분 답변 감사합니다 ^^
열심히 공부해보도록 하겠습니다 ㅎㅎ -
예그리나
휴...한참 쓰다가 잘못 눌러서 답변이 날아가버렸군요 ㅡㅡ;;
간략히 말씀 드리겠습니다.
배열의 메모리 구조를 어떻게 생각 하시는지요???
혹시 열혈강의에 나온 행과 열로 그려진대로 생각 하시는건가요? 그럼 그 생각을 덮어 두시는게
이해 하시기 더 편할겁니다.
int a[3][3]은 3칸짜리 배열 안에 3칸짜리 배열이 각각 들어 있는겁니다.
즉, 배열 안에 배열이 들어 있는 구조가 되는거죠.
\배열명은 배열의 첫 요소의 주소이다.\ 라 -
피리
다차원 배열에 대한 부분은 생각할게 좀 있죠.. -_ㅡ;;
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2692424 | 2차원배열 자료입력질문이요! (1) | 똘끼 | 2025-04-22 |
2692401 | 유닉스안에서 C언어를 이용한 명함 만들기 입니다; 이해안가는 부분이있네요 | 2gether | 2025-04-22 |
2692374 | 고수님들 댓글 마니부탁해요!!! (2) | 엄지 | 2025-04-22 |
2692343 | scnaf에 자꾸 선언을 참조하라는데;; (8) | 도래 | 2025-04-22 |
2692282 | 도스상에서 생성된 exe파일에 press~ 뜨게 하기 (4) | 회사원 | 2025-04-21 |
2692256 | scanf("%*c"); ㅠㅠ 고수님들 | 거북이 | 2025-04-21 |
2692230 | 하노이탑 질문입니다. (1) | 미쁘다 | 2025-04-21 |
2692210 | 정보 올림피아드 문제인데.. 풀이 과정이 궁금합니다.(재귀함수) (5) | 물티슈 | 2025-04-20 |
2692144 | C언어와 리눅스에 대한 질문입니다. | 싴흐한세여니 | 2025-04-20 |
2692114 | 컨텍스트 스위칭하는데 걸리는 시간 측정.. | YourWay | 2025-04-19 |
2692086 | 간접참조 연산자, 증감연산자 질문이용! (2) | 블랙캣 | 2025-04-19 |
2692056 | 주석좀 달아주세요. 몇개적엇는데 몇개만달아주세요. (2) | DevilsTears | 2025-04-19 |
2691978 | 진수 쉽게 이해하는법... (3) | 지지않는 | 2025-04-18 |
2691949 | getchar() 한 문자를 입력받는 함수 질문 | 채꽃 | 2025-04-18 |
2691919 | 배열 정렬 및 합치기 질문입니다. | 사과 | 2025-04-18 |
2691845 | c언어왕초보 질문이 있습니다........ | 루나 | 2025-04-17 |
2691815 | void add(int num); 함수... (4) | 살랑살랑 | 2025-04-17 |
2691756 | 명령 프롬프트 스크롤바가 없어요 | 두메꽃 | 2025-04-16 |
2691725 | 자료구조에 관련해서 질문이 있어 글을 올립니다. | 누리알찬 | 2025-04-16 |
2691697 | if 문에서 구조체 배열에 저장되있던 문자열 검사하는 법 ? (2) | 민트맛사탕 | 2025-04-16 |