16. 다차원 배열


- 2차원 배열에서 첫번째 인덱스는 열, 두번째 인덱스는 행을 의미한다.

- 다차원 배열의 초기화는 1차원 배열과 같은 형태를 취한다.

- 다차원 배열은 메모리상에서 1차원 배열과 같은 구조를 지니지만, 개념적으로 다차원으로 이해하는 것이 편하다.

- 3차원 이상의 배열은 사실상 거의 쓰이지 않는다.

- 무조건 차원을 늘리는 것보다, 배열의 한 요소를 크게 만드는 것이 훨씬 이해도 쉽고 코딩도 쉽다.



'학부 전공 > C' 카테고리의 다른 글

18. 다차원 배열과 포인터  (0) 2010.07.14
17. 포인터의 포인터  (0) 2010.07.14
14. 포인터와 함수  (0) 2010.07.14
13. 포인터와 배열  (0) 2010.07.14
12. 포인터의 이해  (0) 2010.07.14

14-1 함수의 인자로 배열 전달

- 함수는 인자를 복사하여 전달한다. 그것이 매개 변수이다.

- 배열을 통째로 전달하는 것은 불가능하지만, 배열의 주소 값을 인자로 전달할 수는 있다.


sizeof(배열이름) / sizeof(자료형) : 배열의 길이

- 배열을 인자로 전달받는 함수의 경우, 대부분 배열의 길이도 함께 전달받는다.


14-2 Call-By-Value 와 Call-By-Reference


 * call-by-value ( 값에 의한 호출 )

- 일반적인 함수 호출의 형태. 값의 복사.
- 호출된 함수 내에서 전달된 값을 변경하더라도, 호출한 함수에서의 값은 변하지 않는다.


 * call-by-reference ( 참조에 의한 호출 )

- 주소를 인자로 전달한다. 
- 호출된 함수 내에서 호출한 함수의 변수를 조작할 수 있다.


- scanf에서 입력받을 변수에 &를 붙이는 이유는 주소 값을 전달해주기 위해서이다.
- string(char형 배열)으로 입력받을 때에는 그 이름 자체가 주소 값이므로 &를 붙이지 않는다.


14-3 const 키워드

const int* pnt = &a;
- 포인터가 가리키는 변수를 상수화 하겠다는 의미.
- 포인터를 통한 값의 변경이 금지된다. 하지만 해당 변수의 이름을 통한 값의 변경은 허용된다.

int* const pnt = &a;
- 포인터를 상수화 하겠다는 의미.
- 포인터를 변경하는 것이 불가능하다. 하지만 포인터가 가리키는 변수는 변경 가능하다.

const int* const p = &a;
- 포인터와 포인터가 가리키는 변수를 상수화.


- const 키워드를 많이 사용하게 될수록 코딩이 안정적이게 된다.



'학부 전공 > C' 카테고리의 다른 글

17. 포인터의 포인터  (0) 2010.07.14
16. 다차원 배열  (0) 2010.07.14
13. 포인터와 배열  (0) 2010.07.14
12. 포인터의 이해  (0) 2010.07.14
11. 1차원 배열  (0) 2010.07.14

13-1 포인터와 배열


- 배열의 이름은 포인터이다. 
(정확히는 상수 포인터)

- 배열의 이름은 첫번째 요소의 주소 값이다.

- 배열의 이름을 포인터처럼 사용할 수 있는 것처럼, 포인터를 배열의 이름처럼 사용하는 것이 가능하다.


13-2 포인터 연산

- 포인터 연산에 따른 값의 변화는 해당 포인터의 타입에 따라 다르다.
int형 포인터를 ++ 시키면 값은 4가 증가된다.

- 포인터 연산을 할 때, 배열의 범위를 넘지 않도록 주의한다. 그러한 에러는 검출되지 않은채 잘못된 실행결과가 나온다.


array[i] == *(arr+i)

- 배열의 이름은 포인터와 똑같이 사용할 수 있다.



13-3 문자열 상수를 가리키는 포인터


- 문자열을 표현하는 방법은 변수로 표현하는 법(배열)과 상수로 표현하는 법, 두가지가 있다.

- 문자열 상수는 메모리 공간에 할당되면 주소를 반환한다.

- 특정 컴파일러에서는 같은 문자열 상수를 선언하면 같은 주소값을 쓴다. 최적화를 한 것이다.
(이는 문자열 상수를 조작할 수 없음을 전제로 한다.)



13-4 배열 요소가 포인터인 배열

char* arr[];

- 포인터를 요소로 지니는 포인터 배열.

- char형 포인터인 경우 문자열 배열 이라고도 한다.




'학부 전공 > C' 카테고리의 다른 글

16. 다차원 배열  (0) 2010.07.14
14. 포인터와 함수  (0) 2010.07.14
12. 포인터의 이해  (0) 2010.07.14
11. 1차원 배열  (0) 2010.07.14
9. 함수  (0) 2010.07.09

12-1 포인터


- 포인터란 메모리의 주소 값을 저장하기 위한 변수이다.

- 포인터의 크기는 4바이트이다. 이것은 주소가 4바이트로 표현된다는 것을 의미한다.

- 포인터를 선언할 때에는 *연산자를 사용한다.

- 주소 값을 참조할 때 : & 연산자
- 포인터값을 참조할 때 : * 연산자

- 포인터의 타입은 메모리를 참조하는 범위를 알려준다.



12-2 포인터의 잘못된 사용


int* pnt;
*pnt = 10;

위의 경우 포인터를 초기화 해주지 않았으므로 *pnt의 값은 쓰레기 값이다. 즉 메모리의 어디를 참조하는지 불분명한 상태에서 값을 대입할 수 없다. 위의 코드는 런타임 에러를 발생시킨다.


int* pnt = 10;
*pnt = 10;

위의 경우 포인터를 10이라는 값으로 초기화하고 있는데, 이 역시 불분명한 메모리 주소이다. 위 코드 또한 런타임 에러를 발생시킨다.




'학부 전공 > C' 카테고리의 다른 글

14. 포인터와 함수  (0) 2010.07.14
13. 포인터와 배열  (0) 2010.07.14
11. 1차원 배열  (0) 2010.07.14
9. 함수  (0) 2010.07.09
8. 분기문  (0) 2010.07.08

11-1 1차원 배열의 선언


자료형 배열이름[길이];

- 배열의 길이를 선언할 때에는 반드시 상수를 사용해야 한다.


int array[] = {1, 2, ,3};

이렇게 선언하면 자동으로 3칸짜리 배열이 만들어지고, 각각의 인덱스에 초기화가 된다.


int array[5] = {1, 2, 3};

이렇게 선언하면 5칸짜리 배열이 만들어지고, 해당하는 값이 없는 칸(4,5번째)은 0으로 초기화된다.



11-2 배열을 이용한 문자열의 표현


char str[] = "string" ;

- 한 칸에 한 문자를 저장하므로 char형으로 선언
- null문자의 삽입까지 합쳐서 문자열길이 + 1만큼의 배열이 선언됨.

- null문자(\0)는 문자열의 끝을 나타내며, 아스키 코드값은 0 이다.
(숫자 0 의 아스키 코드값은 48이다.)

- scanf로 입력 받을때, 문자열의 경우는 &를 붙이지 않는다.



'학부 전공 > C' 카테고리의 다른 글

13. 포인터와 배열  (0) 2010.07.14
12. 포인터의 이해  (0) 2010.07.14
9. 함수  (0) 2010.07.09
8. 분기문  (0) 2010.07.08
7. 반복문  (0) 2010.07.08

9-1 함수의 정의 및 선언

- Divide and Conquer!

- 전달인자나 반환값이 없어도 된다.

- 호출되기 전에 선언되어야 한다.


9-2 변수의 범위(scope)

1) 지역변수

- 중괄호 내의 '지역'에 선언된 변수. 선언된 지역 내에서만 유효하다.
- 지역변수는 선언될 때 메모리 상에 올라갔다가, 선언되었던 지역이 끝나면 지워진다.
- 선언된 지역보다 상위 지역에 같은 이름의 변수가 있어도, 하위 지역의 전역변수가 사용된다.


2) 전역변수

- 함수 외부에 선언된 변수. 모든 코드에서 사용가능하다.
- 전역변수는 초기화하지 않으면 쓰레기값이 아니라 0 이 들어간다.


3) static 변수

- 지역변수의 선언에서 자료형 앞에 static이라는 키워드를 붙인 변수
- 함수가 종료되어도 메모리에 그대로 남아있다.
- 반복문에서 값을 유지시킬 수 있다.


4) register 변수

- 지역변수의 선언에서 자료형 앞에 register라는 키워드를 붙인 변수
- CPU의 레지스터에 저장이 된다. 빠르게 처리된다.
- 레지스터에 적재할 공간이 없으면 무시된다.


9-3 재귀적 함수 호출

- 함수 내에서 자기 자신을 다시 호출하는 형태.
- 종료조건을 설정하지 않으면, 완료되지 않은 함수가 계속 쌓이게 되어 메모리 부족으로 프로그램이 비정상 종료된다.



'학부 전공 > C' 카테고리의 다른 글

12. 포인터의 이해  (0) 2010.07.14
11. 1차원 배열  (0) 2010.07.14
8. 분기문  (0) 2010.07.08
7. 반복문  (0) 2010.07.08
6. printf함수와 scanf함수  (0) 2010.07.08

8-1 if - else

if( 조건 )
{
//내용
}


if( 조건 )
{
//내용
}
else if( 조건 )
{
//내용
}
else if( 조건 )
{
//내용
}
else 
{
//내용
}

- if-else를 사용하면 불필요한 비교 연산을 줄일 수 있다.

 * 조건 연산자 ( 삼항 연산자 )
 조건 ? A : B
조건이 true면 A, false면 B
- 조건 연산자는 실행할 문장이 많지 않을때, 코드를 간결하게 한다.


8-2 continue와 break

- break문을 만나면, 가장 가까이서 감싸고 있는 반복문 하나를 빠져 나오게 된다.

- continue문을 만나면, 가장 가까이서 감싸고 있는 반복문의 처음으로 돌아간다. for문일 경우, 증감문을 실행시키고 조건문을 비교한다.


8-3 switch-case

switch(n)
{
case 1: 내용. break;
case 2: 내용. break;
case 3: 내용. break;
default: 내용. 
}

- switch문에 전달되는 인자 n은 int형이나 char형 변수여야 한다.
- break를 쓰지 않으면 해당 case의 아래부분을 전부 실행해버린다.

- 분기의 개수가 많아지면 switch-case로 만드는게 간결해보인다.


'학부 전공 > C' 카테고리의 다른 글

11. 1차원 배열  (0) 2010.07.14
9. 함수  (0) 2010.07.09
7. 반복문  (0) 2010.07.08
6. printf함수와 scanf함수  (0) 2010.07.08
5. 상수와 기본 자료형  (0) 2010.07.08


7-1 while

- while문은 조건이 만족될 때까지 계속 반복을 시키는 것이다.
- 반복해야할 문장이 하나이면 중괄호를 쓰지 않아도 된다.

while(1)
{
// 무한 루프
}


7-2 do-while

- while문은 조건 검사를 앞에서 하지만 do-while문은 뒤에서 한다.

do
{
// 무한 루프
} while(1)


7-3 for

- for문은 초기문, 조건문, 증감문 3가지를 포함하고 있다.

for( 초기문; 조건문; 증감문 )
{
//반복 내용
}

- 증감문이 실행된 다음 조건문의 조건에 맞으면 반복, 틀리면 탈출.
- 세 문장이 꼭 같은 변수를 써야만 하는것은 아니지만, 다른 변수로 만들게 되면 가독성이 떨어진다.


'학부 전공 > C' 카테고리의 다른 글

9. 함수  (0) 2010.07.09
8. 분기문  (0) 2010.07.08
6. printf함수와 scanf함수  (0) 2010.07.08
5. 상수와 기본 자료형  (0) 2010.07.08
4. 데이터의 표현방식  (0) 2010.07.07

6-1 printf 함수

1. printf는 문자열을 출력하는 함수이다.

2. printf는 특수 문자 출력이 가능하다.

*특수 문자 목록
\a : 경고음
\b : 백스페이스
\f : 폼 피드(페이지 넘김)
\n : 개행 ( enter )
\r : 캐리지 리턴( 커서를 맨 앞으로 옮김 )
\t : 수평 탭
\v : 수직 탭
\\ : 원 표시 ( 또는 백슬래시 )
\' : 작은 따옴표
\" : 큰 따옴표

3. printf의 f는 formatted를 의미.

 *서식 문자 목록
%c : 단일 문자
%d, %i : 부호 있는 10진 정수
%f : 부호 있는 10진 실수
%s : 문자열
%o : 부호 없는 8진 정수
%u : 부호 없는 10진 정수
%x : 부호 없는 16진 정수, 10이상을 표시하는데 소문자 사용
%X : 부호 없는 16진 정수, 10이상을 표시하는데 대문자 사용
%e : e 표기법에 의한 실수
%E : E 표기법에 의한 실수
%g : 값에 따라 %f, %e 중 선택
%G : 값에 따라 %f, %E 중 선택
%% : % 기호 출력


4. 필드 폭을 지정할 수 있다.
-서식 문자에서 %기호 뒤에 숫자를 넣음으로써 공간을 확보할 수 있다.
%8d : 8칸 띄운 뒤 오른쪽 정렬 후 출력
%-8d : 8칸 띄운 뒤 왼쪽 정렬 후 출력
%+8d : 8칸 띄운 뒤 오른족 정렬 후 양수는 +, 음수는 -를 붙여서 출력



6-2 scanf 함수

- 서식 문자를 사용해서 해당되는 데이터 타입으로 입력받는다.

- 실수를 입력받을 때, double형은 %le를 사용한다.



'학부 전공 > C' 카테고리의 다른 글

8. 분기문  (0) 2010.07.08
7. 반복문  (0) 2010.07.08
5. 상수와 기본 자료형  (0) 2010.07.08
4. 데이터의 표현방식  (0) 2010.07.07
3. 변수와 연산자  (0) 2010.07.06

5-1 C언어가 제공하는 기본 자료형


- C언어는 변수의 선언을 위해 자료형을 제공한다.

 * 기본 자료형과 데이터 표현 범위

자료형 할당되는 메모리 크기 표현 가능한 데이터의 범위
정수형 char 1바이트 -128 ~ 127
short 2바이트 -32768 ~ 32767
int 4바이트 -2147483648 ~ 2147483647
long 4바이트 -2147483648 ~ 2147483647
실수형 float 4바이트 3.4*10^-37 ~ 3.4*10^38
double 8바이트 1.7*10^-307 ~ 1.7*10^308
long double 8바이트 혹은 그 이상 유동적임


- sizeof는 함수가 아니라 연산자이다. 


- 컴퓨터는 내부적으로 int형 데이터를 가장 빠르게 연산(처리)한다. 따라서 메모리가 낭비되더라도 연산을 하는 정수에는 int형을 쓰는게 좋다.
- char형은 문자를 표현하는데 좋다. 문자로 연산을 하는 일은 드물기 때문이다.

- unsigned가 붙으면 부호 비트를 사용하지 않는다. 따라서 각 데이터 표현 범위가 -x ~ x-1 에서 0 ~ 2x-1이 되는 것이다. 


5-2 상수

- 리터럴(literal)상수 : 이름이 없는 상수. 코드상에서 이름없이 문자,숫자 그대로 쓰인다.

- 심볼릭 상수 : 이름을 지니는 상수. const 키워드를 사용하거나, 매크로를 사용할 수 있다.
ex) const int MAX = 100;
 const 키워드를 사용할 때에는 선언과 동시에 초기화를 해야만 한다. (상수이기 때문에 나중에 변경할 수 없다.)

- 상수의 이름은 일반적으로 대문자로 표시한다.


5-3 자료형 변환


1) 자동 형 변환

-대입 연산시 발생.
 실수형 데이터를 정수형 데이터 타입에 대입하면 소수부의 손실이 발생한다.
 값의 표현 범위가 적은 데이터 타입에 대입하면 비트의 앞부분이 그 차이만큼 버려진다. 즉, 값이 달라진다.

-정수의 승격 ( int형 연산이 빠른 이유 )
 char형과 short형 데이터들의 연산은 각 데이터를 int형으로 변환시킨후에 연산을 진행한 후 다시 해당 데이터 타입으로 변환시킨다. int형 연산은 이 형 변환을 거치지 않기 때문에 연산이 빠른 것이다.

-산술 연산 과정에서 발생
 데이터 타입이 다른 두 수를 연산 할 때, 데이터의 손실이 최소화되는 방향으로 형 변환이 일어난다.

산술 연산 과정에서의 형 변환 방향은
char -> int -> long -> float -> double -> long double 이다.


2) 강제 형 변환 ( 명시적 형 변환 )

-변수 앞에 괄호를 붙여서 강제적으로 데이터 타입을 변환시킬 수 있다.
ex) b = (float)a/2 ;
 

'학부 전공 > C' 카테고리의 다른 글

7. 반복문  (0) 2010.07.08
6. printf함수와 scanf함수  (0) 2010.07.08
4. 데이터의 표현방식  (0) 2010.07.07
3. 변수와 연산자  (0) 2010.07.06
2. 프로그램의 기본 구성  (0) 2010.07.06

+ Recent posts