22-1 구조체


-구조체란 하나 이상의 변수를 그룹 지어서 새로운 자료형을 정의하는 것이다.

struct position
{
int x;
int y;
};
- 여기서 position이 구조체의 이름이 되고, x와 y가 구조체 멤버가 된다.

- 선언할때는 struct 키워드를 꼭 붙여야 한다. ex) struct position p1;

- 구조체 멤버에 접근하기 위해서는 .연산자를 사용한다.

- 구조체 멤버는 배열과 같은 형태로 선언하면서 초기화 할 수 있다.


22-2 구조체와 배열과 포인터

- 구조체를 배열의 요소로 쓸 수도 있다.

- 구조체가 요소인 배열은 2차원 배열과 같은 구조로 생각할 수 있다.

- 구조체 포인터를 선언하여 구조체 변수를 가리킬 수 있다.
- 구조체의 맴버로 포인터 변수가 선언 될 수 있다.

- 구조체 변수의 주소 값은 첫번째 멤버의 주소 값과 일치한다.



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

24. 파일 입출력  (0) 2010.07.16
23. 구조체와 사용자 정의 자료형 2  (0) 2010.07.15
21. 문자와 문자열 처리 함수  (0) 2010.07.15
19. 함수 포인터와 void 포인터  (0) 2010.07.14
18. 다차원 배열과 포인터  (0) 2010.07.14

21-1 스트림과 데이터의 전송


- 스트림이 있어야 프로그램과 입출력장치 사이에 입력과 출력이 가능하다.

- 콘솔 입출력 스트림은 자동으로 생성되고, 자동으로 소멸된다.

- 파일 입출력 스트림은 직접 생성시키고, 소멸시켜야 된다.


21-2 문자 입출력 함수

int putchar(int c);
-문자 c를 화면에 출력한다.

int fputc(int c, FILE* stream);
-문자 c를 stream으로 출력한다.

int getchar(void);
-키보드로부터 한 문자를 입력받는다.

int fputc(FILE* stream);
-stream으로부터 한 문자를 입력받는다.


-위 함수들에서 오류가 발생하거나 파일의 끝에 도달했을 경우, EOF를 리턴한다.
-EOF의 실제 값은 -1이다.

-문자 입출력 함수들은 printf나 scanf와 비교하여 간단한 작업밖에는 할 수 없으나 그만큼 가볍고 메모리를 덜 차지한다.


21-3 문자열 입출력 함수

int puts(const char* s);
-문자열 s를 모니터로 출력한다. 그 후 줄을 바꾼다.

int fputs(const char* s, FILE* stream);
-문자열 s를 stream으로 출력한다. 줄을 바꾸지 않는다.

char* gets(char* s);
-문자열 s를 키보드에서 입력받는다.

char* fgets(char* s, int n, FILE* stream);
-문자열 s를 stream에서 길이 n만큼 입력받는다.

-gets는 선언한 배열보다 큰 길이의 문자열이 들어오면 오버플로우가 발생한다. 
fgets는 n까지만 읽어들인다.

-fgets는 항상 NULL문자를 삽입해 준다. n보다 긴 문자열이 입력될 경우, n-1까지만 읽고 n번째에는 NULL문자를 삽입한다.


21-4 표준 입출력과 버퍼

- 표준 입출력 함수를 사용하는 경우에는 버퍼를 제공받는다.

- 버퍼를 사용하는 이유는 성능 향상을 위해서이다. 버퍼에 모아두었다가 한꺼번에 처리하는 것이다.

int fflush(FILE* stream);
- 버퍼를 비우는 함수. 입력스트림은 내용이 전부 지워지고, 출력스트림은 즉시 출력된다.

- fgets함수를 사용할 때, 입력받은 문자열이 함수에서 지정한 n보다 크다면, 나머지는 버퍼에 그대로 남아있게 된다. 이 때, fflush함수를 쓰면 그것들을 전부 버릴수 있다.



21-5 문자열 조작 함수

size_t strlen(const char* s);
-문자열 s의 길이를 리턴한다. 문자열의 마지막에 있는 NULL문자는 포함하지 않는다.

char* strcpy(char* dest, const char* src);
-src의 문자열을 dest로 복사한다. dest의 길이가 더 작으면 오버플로우가 발생한다.

char* strncpy(char* dest, const char* src, size_t n);
-src의 문자열을 길이n만큼만 dest로 복사한다. 마지막에 NULL문자를 따로 삽입해주어야한다.

char* strcat(char* dest, const char* src);
-src의 문자열을 dest의 뒤에 추가한다. dest의 길이를 초과하는 결과가 나올경우, 오버플로우가 생긴다.

char* strncat(char* dest, const char* src, size_t n);
-stc의 문자열을 dest의 뒤에 길이 n까지 추가한다. (n은 합친 후의 문자열의 총 길이)

int strcmp(const char* s1, const char* s2);
-문자열 s1과 s2가 같으면 0을 리턴, s1이 크면 양수를 리턴, s2가 크면 음수를 리턴한다.
-문자열이 더 크다는 것은 아스키 코드값을 비교한 결과이다. 사전순으로 뒤에 있을수록 큰 문자열이다.

int strncmp(const char* s1, const char* s2, size_t n);
-strcmp와 같지만 길이 n까지만 비교한다.

int atoi(char *ptr);
-문자열을 int형 데이터로 변환

int atol(char *ptr);
-문자열을 long형 데이터로 변환

int atof(char *ptr);
-문자열을 float형 데이터로 변환



19-1 함수 포인터

- 함수 포인터란 메인 메모리에 올라와 있는 함수를 가리킬 수 있는 포인터.

- 함수의 이름은 함수의 위치를 가리키는 포인터

리턴형 (*포인터)(매개변수) ;

- 함수 포인터는 함수 처럼 사용 가능하다.


19-2 void 포인터

- void로 선언된 포인터는 어떤 값이건 담을 수 있다.

- 타입 정보가 지정되지 않았기 때문에, 값의 참조나 포인터 연산이 불가능하다.
- 형 변환을 거쳐서 메모리의 동적 할당시에 사용된다.


19-3 main 함수의 인자의 전달

void main(int argc, char **argv)

로 메인을 선언하면 인자를 받을수 있다.

- argc는 인자의 개수, argv는 문자열 배열의 이름이다.


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

22. 구조체와 사용자 정의 자료형  (0) 2010.07.15
21. 문자와 문자열 처리 함수  (0) 2010.07.15
18. 다차원 배열과 포인터  (0) 2010.07.14
17. 포인터의 포인터  (0) 2010.07.14
16. 다차원 배열  (0) 2010.07.14


18-1 2차원 배열의 이름


- 1차원 배열의 이름이 배열의 첫번째 요소를 가리키는 포인터인 것처럼, 2차원 배열의 이름또한 배열의 첫번째 요소를 가리키는 포인터이다.

- 2차원 배열의 이름은 포인터 연산 시 행 단위로 이동한다.

- 포인터의 타입에는 표인터 연산시 이동하는 구간에 대한 정보가 들어있다.

- 2차원 배열의 이름은 해당하는 배열의 열의 개수에 따라 다른 의미를 가진다.
(포인터 연산 시, 열의 개수만큼 이동하게 된다.)
-따라서 2차원 배열을 가리키는 포인터를 선언할 때에는 열의 개수를 알려줘야 한다.

int (*pnt)[열의 개수];

- 함수의 매개변수 선언 일때는 int pnt[][열의 개수] 형태의 선언이 가능하다.



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

21. 문자와 문자열 처리 함수  (0) 2010.07.15
19. 함수 포인터와 void 포인터  (0) 2010.07.14
17. 포인터의 포인터  (0) 2010.07.14
16. 다차원 배열  (0) 2010.07.14
14. 포인터와 함수  (0) 2010.07.14


17 포인터의 포인터

int **dpnt = &pnt;
- 포인터를 가리키는 포인터. 더블 포인터 라고 한다.

- call-by-value와 call-by-reference는 상대적으로 결정된다.
변수 입장에서는 call-by-reference이지만, 포인터 입장에서는 call-by-value가 되는 것이다.
포인터 입장에서 call-by-reference를 하려면, 더블 포인터를 써야 한다.

- 간단하게 생각하면, call-by-value는 진짜 값을 바꿀수 없는 것이고, call-by-reference는 진짜 값을 바꿀수 있는 것이다.

- 포인터를 요소로 가지는 배열의 이름은 더블 포인터이다.



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

19. 함수 포인터와 void 포인터  (0) 2010.07.14
18. 다차원 배열과 포인터  (0) 2010.07.14
16. 다차원 배열  (0) 2010.07.14
14. 포인터와 함수  (0) 2010.07.14
13. 포인터와 배열  (0) 2010.07.14

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

+ Recent posts