- 다차원 배열 예제 -
#include <stdio.h>
int main(void)
{
int arr1[3][4];
int arr2[7][9];
printf("세로 3, 가로 4 : %d\n", sizeof(arr1));
printf("세로 7, 가로 9 : %d\n", sizeof(arr2));
return 0;
}
- 다차원 배열 예제2 -
#include <stdio.h>
int main(void)
{
int villa[4][2];
int popu, i, j;
//가구별 거주 인원 입력 받기
for(i = 0; i < 4; i++)
{
for(j = 0; j < 2; j++)
{
printf("%d층 %d호 인구수: ", i+1, j+1);
scanf("%d",&villa[i][j]);
}
}
//빌라의 층별 인구수 출력하기
for(i = 0; i < 4; i++)
{
popu = 0;
popu += villa[i][0];
popu += villa[i][1];
printf("%d층 인구수 : %d\n", i+1, popu);
}
return 0;
}
- 다차원 배열 기본형 준비 -
#include <stdio.h>
#define N 3
#define M 4
int main(void)
{
int iArry[N][M];
int iCntN;
int iCntM;
int iCnt; //입력 자동화
for(iCntN = 0, iCnt = 1; iCntN < N; ++iCntN) //입력, 여기서 iCnt = 1 초기화
{
for(iCntM = 0; iCntM < M; ++iCntM)
{
//printf("숫자를 입력하세요 : "); //수동
//scanf("%d",&iArry[iCntN][iCntM]);
iArry[iCntN][iCntM] = iCnt; //자동 ( (0,0) = 1, (0,1) = 2 .... (0,3) = 4, (1,0) = 5,....)
++iCnt;
}
}
for(iCntN = 0; iCntN < N; ++iCntN) //출력
{
for(iCntM = 0; iCntM < M; ++iCntM)
{
printf("[%5d] ",iArry[iCntN][iCntM]);//그 행[iCntN]의 열을 전부 출력
}
putchar('\n');
}
for(iCntN = 0; iCntN < N; ++iCntN) //주소 출력
{
for(iCntM = 0; iCntM < M; ++iCntM)
{
printf("[%08X] ",&iArry[iCntN][iCntM]);
}
putchar('\n');
}//즉, 메모리 저장할 때는 한줄로 되있음을 컴파일 해서 출력해보면 알 수 있다.
//이러한 역활을 컴파일이 해준다.
//0행, 0열 (즉, iArry의 주소 값)
printf("[%08X]\n",iArry+0);
printf("[%08X]\n",iArry[0]); //이렇게 해도 iArry의 시작주소가 나온다.
printf("[%08X]\n\n",&iArry[0][0]);
//1,0
printf("[%08X]\n",iArry+1);
printf("[%08X]\n",iArry[1]);
printf("[%08X]\n\n",&iArry[1][0]);
//2,0
printf("[%08X]\n",iArry+2); //세로로 2칸 이동(줄의 크기 만큼 증가)
printf("[%08X]\n",iArry[2]); //여기서 뒤에 +1 을 하면 가로로 1칸 이동
printf("[%08X]\n\n",&iArry[2][0]);
//즉, 2차원 배열에서는 A + 1 은 줄 이동이 발생하고, 1차원 배열에서는 4byte 이동이 발생했다.(int형이라 가정했을 시)
//A[0] + 1 저 가로가 한 칸을 의미 한다. (즉, A[0][1] 과 같음을 알 수 있다.)
printf("[%08X]\n\n",iArry[0]+2); //가로로 2칸 이동했음을 알 수 있다.
printf("[%08X]\n",&iArry+1); //배열 이름에 &를 하게 되면 그 배열 전체를 의미한다. 즉, 48바이트의 크기의 배열을 한칸 뛰어넘어라.
//1차원 배열에서는 1. &배열 이름 -> 배열 전체(한 줄) 2. 배열 이름 -> 배열 1개(여기서 + 1 을 해주면 하나만 뛰어넘는다.(int형이라 가정하면 4바이트 건너뜀))
//다시 정리해서 말하자면 2차원 배열에서는 1. &배열 이름 -> 배열 전체(2차원 배열), 2. 배열 이름 -> 배열 1줄(1차원 배열)(세로로 이동), 3. 배열 이름[] -> 배열 1개(가로로 이동)
//3차원 배열에서는 1. &배열 이름 -> 배열 전체(3차원 배열), 2. 배열 이름 -> 배열 1판(2차원배열), 3. 배열 이름[] -> 배열 1줄(1차원 배열)(세로로 이동), 4. 배열 이름[][] -> 배열 1개(가로로 이동)
return 0;
}
- 다차원 배열 기본형 준비 2 -
#include <stdio.h>
int main(void)
{
int A[5] = {1, 2, 3, 4, 5}; //바로 초기화
printf("1차원 배열 A의 주소는 ? : %08X\n",A);
printf("1차원 배열 A의 주소는 ? : %08X\n",&A);
printf("1차원 배열 A[0]의 주소는 ? : %08X\n\n",&A[0]);
//같은 주소를 출력한다 해서 의미하는 바가 같다. 라는 것은 아니라는 것이다.
printf("1차원 배열 A의 주소는 ? : %08X\n",A+1);
printf("1차원 배열 A의 주소는 ? : %08X\n",&A+1);// 배열 전체를 뛰어넘고 나서 int형인 4바이트 증가.
printf("1차원 배열 A의 주소는 ? : %08X\n\n",&A[0]+1);
//심층 과정
printf("%d\n",*A);
printf("%d\n\n",A[0]);
//즉, 저 심층 과정 공식이 성립한다는 것을 확인 할 수 있다.
printf("%d\n",*(A+1));
printf("%d\n\n",A[1]);
printf("%d\n",A+1);
printf("%d\n",&A[1]);
return 0;
}
/* *(&A[0]) == A[0] 과 같음을 알 수 있다.(그 주소값의 *(값) == 그 배열의 값) *과 &가 만나면 서로 상쇄됨을 알 수 있는 것이다.
저 위에 것을 좀더 심층과정을 겪어보자.
A + 1 = &A[0] + 1
A = &A[0]
*A = *&A[0]
---> *A = A[0]
자, 공식이 하나 튀어 나왔다.
이것을 가지고 이제 우리는 그 배열의 값을 출력 시 2가지 방법으로 출력할 수 있음을 안다.
하나는 배열방식,
&A[2] = 3
두번째는 포인터방식,
*(A+2) = 3
자, 다시 한번 증명을 해보자.
*(A+1) = A[1]
&(*(A+1)) = &A[1]
---> A+1 = &A[1] ( 이것은 주소 값이 서로 같다라는 말 )
값을 출력할 때는 & 없이 배열만,
주소값은 무조건 &
즉, 정리하자면 5를 표현할 때 A[4] 로써 표현이 가능 하고 *(A + 4) 로도 표현이 가능하다.
*/
'개발자 > C 언어' 카테고리의 다른 글
C언어_원,투 포인트 함수 이용 복습 , 리눅스 (0) | 2015.04.20 |
---|---|
C언어_(상수,변수)포인터의 이해 (0) | 2015.04.17 |
C언어_교환법칙, (2,3)차원 배열, 더블 포인터의 이해 (0) | 2015.04.17 |
C언어_구조체 메모리 최적화(전처리어 pragma 사용법),구조체 활용, 공용체 사용법 (0) | 2015.04.17 |
C언어_구조체의 활용(배열 통째로 옮기기, 구조체 메모리 저장 형태) (0) | 2015.04.17 |