프로그래밍/C언어

배열의 특징 C언어

콘파냐 2013. 5. 25. 16:34

배열의 특징 C언어

 

배열명은 포인터 상수이다.

포인터 상수는 주소값이 고정이라는 뜻이다.

 

예외)sizeof 연산자의 피연산자로 사용될 때만은 포인터상수로 취급되지 않고 배열 그자체로 취급된다

 

 

배열을 한번에 초기화하고싶다면 선언과 동시에 해야한다.

 

선언과 동시에 초기화를 할 때, = 는 대입(Operator)가아닌, = 초기화 구두점이다(Punctual)

 

때문에 선언후에는 한번에 초기화 할 수가 없다.

 

선언과 동시에 초기화를 안한다면, 배열 요소 하나하나를 직접 입력 해야한다.

 

 

상수는 좌변값이 될 수 없기때문에 배열명은 좌변값이 될 수가 없다.

 

배열 선언시 배열의 크기는 상수로 해야 한다.

 

배열 선언시 첨자를 변수로 지정한 경우에 값을 집어 넣는 시점에서 문제가 생긴다.

 

꼭 상수로 해야하지만 C++에선 선언과 동시에 변수로 지정하는 방법이 있다.


c언어의 경우 배열을 선언한 후 동적할당을 할 수 없는데 이유는 배열명은 포인터 상수기 때문에 가리키는 메모리주소를 바꿀 수 없기 때문이다.

 

C++의 경우 선언과 동시에 new 연산자로 동적할당을 하기때문에 가능하다.

 

int *p = new int[n]; 잘 알아두도록하자.

 

 

C컴파일러는 컴파일시 배열의 범위를 점검하지 않는다.

 

배열이 선언되었다 가정하자.

 

배열에 값을 넣던가 배열의 값을 읽을때 배열첨자가 상수인 경우 선언된 배열의 범위를 벗어나는지 컴파일시에 알 수 있다.

 

하지만 첨자가 변수인경우는 어떤지 생각해보면, 실행시간에만 알 수 있을것이다.

 

실제로 변수를 넣는경우, 초기화를 하지않으면 당장에 에러는 안난다. 값을 넣으려 하는 순간에 문제가 발생한다.

(그러니 배열 첨자를 변수로 선언하고 에러가 안났다고 좋아하지마라)

 

그러면 실행시간동안 변수가 배열을 벗어나는지 알기위한 점검코드를 수행해야하는데,

 

이는 실행시간을 늘리게되어 최적화에 좋지않다. 그래서 c컴파일러는 아에 배열의 범위를 점검하지 않는다.

 

굳이 점검하려면 점검코드를 넣어야할 것이다. 하지만 이런점검코드는 프로그램의 실행시간을 늘릴것이다.

 

C언어는 배열의 범위점검을 할지 안할지 프로그래머의 몫으로 남겨두었다.

 

여기서 C언어의 특징이 드러나는데 프로그래머의 역량에 따라서 작고빠른 코드를 만들수 있다는 것이다.

 

그만큼 위험부담이 있지만 말이다.

 

 

 지역으로 선언된 배열은 컴파일러가 초기화하지않는다
지역으로 선언된 배열은 컴파일러가 초기화하지않는다.

(대체로 지역적으로 선언된 배열은 선언하자마자 곧바로 어떤값을 채워넣기때문이다.

그래서 쓰레기값을 지니고있고, 그것을 굳이 컴파일러가 힘들게 초기화 하지 않는것이다.

(C언어의 특징-성능에중점을둠)

단, 전역으로 선언된 배열은 지역으로 선언될 때와 달리 0으로 초기화된다.

 

배열의 첨자는 첫번첨자만 생략가능하다(1,2,3,4...차 배열 모두 마찬가지)

 

ar[2][] (x)

반응형