C언어20 C언어 - 구조체와 사용자 정의 자료형(2) typedef 선언 typedef 선언은 기존에 존재하는 자료형의 이름에 새 이름을 부여하는 것이다. 예를 들어보자. typedef int INT; 이는 int라는 자료형의 이름에 INT라는 이름을 추가하는 것이 된다. 따라서 INT num; 이와 같이 해도 int num;과 같은 선언이 되는 것이다. 포인터 변수 또한 선언할 수 있다. INT *ptr; typedef 선언에 있어 새로운 이름의 부여는 가장 마지막에 등장하는 단어를 중심으로 이뤄진다. typedef name1 name2 mane3; 이러한 선언이 있다면 name3가 "name1 name2"에 부여된 새로운 이름이 되는 것이다. 예를 들어보자. typedef unsigned char UCHAR; 이는 unsigned char의 새로 부여된.. Programming/C 2021. 10. 13. C언어 - 표준 입출력과 버퍼 앞에서 공부했던 printf, scanf, putc, getc 등의 입출력 함수들을 "표준 입출력"이라 한다. ANSI C의 표준에서 정의된 함수이기 때문이다. 입출력 함수들에 대해 잘 모르겠다면 https://jjunsu.tistory.com/4?category=971045 C언어 - 헤더파일, printf, scanf 헤더파일 선언의 필요성 c언어를 사용하며 프로그래밍을 한다면 prinf, scanf라는 함수를 사용하게 된다. 이러한 표준 함수를 호출하기 위해서는 함수와 관련된 헤더파일을 선언해야 한다. #include jjunsu.tistory.com https://jjunsu.tistory.com/27?category=971045 C언어 - 문자와 문자열 함수 getchar, putchar get.. Programming/C 2021. 10. 11. C언어 - 문자와 문자열 함수 getchar, putchar getchar와 putchar는 문자 입출력 함수이다. getchar는 문자 입력 함수이며, stdin으로 표현되는 표준 입력 스트림으로부터 하나의 문자를 입력받아 반환한다. 함수 호출을 성공할 시 쓰인 문자정보가 반환되며, 실패 시 EOF가 반환된다. putchar는 문자 출력 함수이며, 인자로 전달된 문자 정보를 stdout으로 표현되는 표준 출력 스트림으로 전송하는 함수이다. 파일의 끝에 도달하거나 함수 호출 실패 시 EOF를 반환한다. 다음의 예제를 보자. #include int main() { while (1) { int ch = getchar(); if (ch == EOF) break; putchar(ch); } return 0; } 코드를 보면 getchar는 .. Programming/C 2021. 10. 9. C언어 - 스트림(Stream) 스트림(Stream) 스트림은 데이터의 이동 수단이다. 프로그램상에서 모니터로 문자열을 출력할 수 있는 이유가 무엇일까? 이는 문자열을 출력하는 printf 함수가 있기 때문이다. 그럼 printf 함수를 호출할 때 어떠한 경로 및 과정을 거쳐서 출력이 되는가? printf 함수를 입력하기 위한 입력장치인 키보드와, 출력을 위한 장치인 모니터 이 둘은 서로 떨어져 있는 개체이다. 이러한 개체들을 대상으로 데이터를 입출력하기 위해서는 이들을 연결시켜 주는 장치가 필요하다. 이러한 다리 역할을 하는 매개체를 "스트림"이라 한다. 스트림의 생성과 소멸 입출력은 보통 두 가지로 나뉘는데 콘솔 입출력과 파일 입출력이 있다. 둘의 차이점은 파일과의 연결을 위한 스트림의 생성은 우리가 직접 해야 하지만, 콘솔과의 연.. Programming/C 2021. 10. 6. C언어 - 함수 포인터와 void 포인터 메모리 공간에 저장되는 것은 변수뿐만이 아니라, 프로그램 실행의 흐름을 구성하는 함수들도 바이너리(binary) 형태로 저장된다. 그리고 메모리 공간에 저장된 함수의 주소 값을 저장하는 포인터 변수를 "함수 포인터 변수"라고 한다. 함수 포인터 함수 포인터의 포인터 형(타입) 프로그래밍을 할 때 정의되는 모든 함수는 프로그램 실행 시 메인 메모리에 저장되어 실행된다. 배열의 이름이 배열의 시작 주소 값을 의미하듯이, 함수의 이름은 함수가 저장된 메모리 공간의 주소 값을 의미한다. 함수 포인터 변수를 선언할 때는 먼저 함수 포인터의 포인터 형을 결정해야 한다. 변수에서도 그랬듯이 형을 결정하지 못하면 적절한 함수 포인터 변수의 선언이 불가능하다. int SimpleFunc(int num) { . . . ... Programming/C 2021. 10. 5. C언어 - 다차원 배열과 포인터의 관계 1차원 배열이름의 포인터 형과 2차원 배열이름의 포인터 형 int arr[10]; 여기서 arr은 int형 포인터이다. 이를 함수의 인자로 전달하기 위해서는 다음과 같다. #include void SimpleFunc(int *ptr) { . . . . } int main() { . . . . SimpleFunc(arr); . . . . } 이제 2차원 배열을 봐보자. int arr2[2][3]; 1차원 배열에서 arr은 int형 포인터였으니 2차원 배열인 arr2는 int형 더블 포인터일까? 이 질문의 답은 "아니다"이다. int형 더블 포인터이기 위해서는 다음과 같아야 한다. int *ptr[2]; 2차원 배열 이름이 더블 포인터를 가리킨다고 오해하면 안 되는 것이다. 그럼 2차원 배열 이름의 포인터 .. Programming/C 2021. 10. 4. C언어 - 포인터의 포인터(다중 포인터) 배열도 다차원 배열이 있듯이 포인터에도 이중 포인터(더블 포인터), 다중 포인터가 존재한다. 포인터 변수를 가리키는 이중 포인터 변수 이중 포인터는 *연산자를 두 개 이어서 선언한다. int **p; 포인터 변수도 메모리 공간에 할당이 되는 변수이다. 이를 대상으로 &연산이 가능하고, 이때 반환되는 주소 값은 "더블 포인터 변수"에 저장이 가능하다. #include int main() { double num = 3.14; double *ptr = # double **dptr = &ptr; double *ptr2; printf("%9p %9p\n", ptr, *dptr); printf("%9g %9g\n", num, **dptr); ptr2 = *dptr; *ptr2 = 10.99; printf(".. Programming/C 2021. 10. 2. C언어 - 다차원 배열 앞에서 1차원 배열에 대해 알아봤었다. 이번에는 다차원 배열을 대표하는 2차원, 3차원 배열에 대해 알아볼 것이다. 2차원 배열 선언방식은 다음과 같다. int arr[2][2]; 1차원 배열과 선언방식이 유사하다. 다만 2차원 배열은 평면 구조를 띄기 때문에 가로와 세로의 길이를 각각 명시한다. 2차원 배열요소의 접근 모든 배열요소가 0으로 초기화된 배열 int arr[3][3]이 있다고 하자. arr[0][0] = 1이 실행되면 가로 0번째 세로 0번째 위치에 1이 삽입되는 것이다. 이어서 arr[0][1] = 2를 실행하면 가로 1번째 세로 0번째 위치에 2가 삽입된다. 2차원 배열을 for문을 통해 접근하려면 2중 for문을 써야 한다. for(int i=0; i Programming/C 2021. 10. 2. C언어 - 포인터와 함수에 대한 이해 배열을 함수의 인자로 전달하는 방식 배열을 함수의 인자로 전달하려 할 때 배열을 통째로 전달하는 것은 불가능하다. 이때 배열의 주소 값을 인자로 전달하고 이를 통해 접근하도록 유도하는 방법이 있다. 배열의 주소 값을 전달하는 방법은 다음과 같다. int arr[3] = {1, 2, 3}; SimpleFunc(arr); 이때 SimpleFunc 함수의 매개변수는 어떻게 선언될까? 우리는 이미 포인터를 공부하면서 이 방법에 대해 공부했다. void SimpleFunc(int *param) {. . .} int형 배열의 주소 값을 전달받을 것이기 때문에 int형 포인터인 매개변수를 선언해주면 된다. 포인터와 배열의 이름은 같은 것이므로 포인터 대신 배열 이름을 이용해 매개변수를 선언할 수도 있다. void S.. Programming/C 2021. 9. 30. C언어 - 포인터와 배열 이전 글에서 포인터에 대해 알아보았다. 이제 포인터와 배열의 관계에 대해 알아볼 것이다. 배열의 이름도 사실 포인터이다. 하지만 그 값을 바꿀 수 없는 "상수 형태의 포인터"이다. 포인터 변수와 배열의 이름을 비교해보면 다음과 같다. 표에서 보이듯 둘 다 이름이 존재하며, 특정 메모리 공간의 주소 값을 지닌다는 공통점이 있지만 포인터 변수는 이름이 의미하듯이 변수이고, 배열의 이름은 가리키는 대상의 변경이 불가능한 상수라는 차이가 있다. 배열은 상수 형태의 포인터이며 "포인터 상수"라고도 부른다. 또한 배열의 이름도 포인터이기 때문에 배열의 이름을 피연산자로 하는 *연산이 가능하다. 배열이름의 포인터 형과 배열이름을 대상으로 하는 *연산 int arr[5]; 이와 같이 배열이 선언돼 있자 하자. 배열의 .. Programming/C 2021. 9. 29. C언어 - 포인터의 이해 포인터 포인터는 주소를 가리킨다. 이름만 포인터이지 int, char와 같이 변수이다. 이를 포인터 변수라 부른다. 변수가 어떤 값을 저장하는 것처럼, 포인터는 변수의 주소 값을 저장한다. "정수 6이 저장된 int형 변수 num을 선언하고 이 변수의 주소 값 저장을 위한 포인터 변수 pnum을 선언한 후, pnum에 변수 num의 값을 저장하자."와 같은 문장이 요구하는 바를 코드로 작성해보자. #include int main() { int num = 6; int *pnum; pnum = # printf("int형 변수 num의 주소: %d\n", &num); printf("포인터 pnum의 값: %d\n", pnum); printf("포인터 punm이 가리키는 값: %d\n", *pnum); .. Programming/C 2021. 9. 27. C언어 - 1차원 배열 배열이란? 단순하게 "둘 이상의 변수를 모아 놓은 것"이다. 배열은 다수의 데이터를 저장하고 처리하는 경우에 유용하게 사용할 수 있다. 배열은 1차원 배열뿐만 아니라 2차원, 3차원 등 다차원 배열이 있다. 우선 1차원 배열에 대해서 알아본 후, 나중에 다차원 배열에 대해 설명하겠다. 1차원 배열 선언 배열을 선언하는 데에는 3가지 요소가 필요하다. int //배열을 이루는 요소의 자료형 arr //배열의 이름 [4] //배열의 길이 즉, 위의 배열이 선언하는 바는 "int형 변수 4개로 이루어진 arr이라는 이름의 배열을 선언해라"이다. 다른 배열을 예시로 더 들어보겠다. double arr[3]; // double형 변수 3개로 이루어진 배열 arr char str[5]; // char형 변수 5개로.. Programming/C 2021. 9. 23. 이전 1 2 다음 728x90