본문 바로가기
프로그래밍

배열에 C언어 연구

by 건우아빠유리남편 2009. 7. 19.
반응형


#include <stdio.h>


//배열에 관한 여러가지 이야기들..

//==============================================================================================
//1. 배열의 크기에 대해서..
/*
void main()
{
 //예전 방식의 C : const int sz =10;
 //               int a[sz]; // sz가 가르키는 메모리에 가서 값을 꺼내게 된다.
 //               그래서 예전에는  #define sz 10
 //99년 표준화 이후(C99) : int a[sz]; //sz가 10이라는 사실을 컴파일러가
 // 또는 C++                          //기억하고 있다가 사용
 const int sz =10;  //int sz =10; error
 int a[ sz ]; //??  ok.. sz  상수
 //-----------------------------------------------------------------------------------
 
 const int s[3] = {1,2,3};
 int b[ s[1] ]; // ?? 될까?  //error .. 배열크기 : 컴파일 시간에 알아야 한다.
       // s[1] -> *(s+1) 로 해석(compile) <- 실험해봐야 알수 있다.
 //-----------------------------------------------------------------------------------
}

void foo(const int s)
{
 int b[ s ]; //?? 될까? //error -> 싱행 되어야 알수있다.
    //여기서 컴파일 time 과 Runtime 개념을 정확히 알아 두세요..
 //-----------------------------------------------------------------------------------

}
*/
//==============================================================================================

 

 

//==============================================================================================
//2.배열 포인터 이야기 ..
/*
void main()
{
 int *p[3]; //?? int* 3개 짜리 배열
 
 int (*q)[3]; //어떤 의미? int[3]인 배열을 가르키는 포인터 !! 반드시 모양 외워 두세요..
 
 // q 가  100번지라고 가정 한다면
 q = q + 1 ; //q의 값은 얼마가 될까 ? ==> int[3] 만큼 증가. -> 112가 된다 !!

 printf("%d\n",sizeof( p ) );
 printf("%d\n",sizeof( q ) );

}
*/
//==============================================================================================


//==============================================================================================
//3. 다차원 배열과 포인터
/*
void main()
{
 //VC6.0 가능 ... C99문법은 type check 가 강화 된다. !!!
 // n차 배열은 n번 [] 해야 값이 나온다 !!!
 int x [3][2] = { 1,2,3,4,5,6 } ;
 int *p = x;  //될까 ?  //error
 int **p = x; //?  //error  x[1] -> 8번지 증가.
       //       p[1] -> 7번지 증가.
 // 결국 필요한것... p[1] 시 8번지 증가
 //     두번 [] 값이 나와야 한다. -> 1차 배열 포인터.

 int (*p)[2] = x; // ok...!!!

 // 이제 p 와 x는 완전히 동일한 표현이 가능

 printf("%d\n", p[1][0] ); // p 는 x와 동일 하게 표현 할수 있다.

 //1교시 핵심 !!
 //결국 n차 배열 주소는 (n-1) 차 배열 포인터를 사용하면 된다. !!!
 //int* p = x; // 의 표현
 //정리 : vc 6.0, vc 2003. linux cc -> 모두 warning 처리
 //모든 cpp 컴파일러  -> error 처리..
 //

//------------------------------------------------------------------------------
 printf("%d\n", x[1][1] ); // 4

 printf("%d\n", x );  //배열 이름 -> 배열의 시작 주소 100번지 가정.

 printf("%d\n", x[1] ); // &x[1][0] = & 와 []는 반대의미 .. !!  결국 108

 printf("%d\n", *x ); // 주소 *(x+0) => x[0] = &x[0][0] 결국 주소 100

 printf("%d\n", **x ); // ? x[0][0] 즉 값 1 ..

 printf("%d\n", *(x[1]+1) );  // x[1][1] = >  4
}
*/
//==============================================================================================


//==============================================================================================
//4. 다차원 배열의 리턴.

//int b;
//int goo();
//int (* foo() )[2]

//다차원 배열을 리턴하는 함수 만들기. - 복잡한 표현이 나오는 이유.. !
/*
//int (* foo() )[2] //1
AR foo()   //2
{
 static int temp[2][2];

 return temp; //2차원 배열 주소 리턴.
}

void main()
{
 foo();
}
*/
//==============================================================================================

 

//==============================================================================================
//5. typedef !!

typedef int(*AR)[2]; //AR은 type 이다. 오늘의 핵심 !!..

void main()
{
 int x[3][2] = {1,2,3,4,5,6};
 AR p = x; //결국 int(*p)[2] = x; 와 동일.
}

//꼭 기억할 내용.
// 1. 배열의 크기는 -> _________ 시간에 알아야 한다. (컴파일)

// 2. n 차 배열의 주소는 ________차 배열 포인터에 담아야 한다. (n-1)

// 3. 2차원 이상의 배열을 리턴하는 함수 만들기

// 4. typedef 로 간단히 처리 하기 !! ~~~

//==============================================================================================

 

반응형

'프로그래밍' 카테고리의 다른 글

Buffer OverFlow  (0) 2009.07.19
Asm Ex File  (0) 2009.07.19
c언어로 짠 싸이월드  (0) 2009.07.19
처음 C++을 배우며 짜봤던 관리프로그램  (0) 2009.07.19
Primary키로 보관하는 배열공간 작성  (0) 2009.07.19

댓글