C 프로그래밍 언어는 매우 인기가 있으며 그 이유를 쉽게 알 수 있습니다. C 프로그래밍은 효율적이며 프로그래머에게 많은 제어 권한을 제공합니다. C ++, Java 및 Python과 같은 다른 많은 프로그래밍 언어는 C를 사용하여 개발되었습니다.
프로그래머라면 작업에만 C를 사용하지 않을 가능성이 날로 증가하고 있습니다. 그러나 정기적으로 사용하지 않더라도 C를 배우는 것이 매우 유익합니다. 그 이유는 다음과 같습니다.
소형 마이크로 컨트롤러에서 데스크톱, 랩톱 및 모바일 운영 체제에 이르는 모든 것을 포함하여 다양한 유형의 컴퓨터 플랫폼에서 사용할 수있는 소프트웨어의 코드를 읽고 쓸 수 있습니다.
메모리 관리 및 가비지 수집과 같은 고급 언어가 백그라운드에서 수행하는 작업을 더 잘 이해할 수 있습니다. 이러한 이해는보다 효율적으로 작동하는 프로그램을 작성하는 데 도움이 될 수 있습니다.
정보 기술 (IT) 전문가라면 C를 배우는 것도 도움이 될 수 있습니다. IT 전문가는 종종 업무의 일부로 스크립트를 작성, 유지 관리 및 실행합니다. 스크립트가 수행 할 수있는 컴퓨터의 운영 체제에 대한 지시 사항의 목록입니다. 특정 스크립트를 실행하기 위해 컴퓨터는 shell 이라는 제어 된 실행 환경을 설정합니다 . 대부분의 운영 체제는 C 기반의 셸을 실행하기 때문에 C 셸 은 IT 전문가가 사용하는 C의 인기있는 스크립팅 적응입니다.
이 기사는 C의 역사를 다루고, C가 왜 그렇게 중요한지 살펴보고, 몇 가지 기본적인 C 코드의 예를 보여주고, 데이터 유형, 연산, 함수, 포인터 및 메모리 관리를 포함하여 C의 몇 가지 중요한 기능을 탐색합니다. 이 기사는 C 프로그래밍을위한 사용 설명서는 아니지만, 일반적인 C 프로그래밍 가이드의 처음 몇 장을 넘어서는 방식으로 C 프로그래밍을 독특하게 만드는 이유를 다룹니다.
C 프로그래밍 언어가 어디에서 왔는지, 어떻게 발전했는지, 오늘날 소프트웨어 개발에서 그것이 갖는 역할을 살펴 보겠습니다.
- C는 무엇입니까?
- C 코드 편집 및 컴파일
- 가장 간단한 C 프로그램
- C의 일반적인 프로그래밍 개념
- C의 기능
- 기능 프로토 타입
- C의 데이터 유형 및 연산
- 처음부터 시작하지 말고 라이브러리 사용
- C의 포인터에 대한 몇 가지 포인터
- C에서 올바르게 포인터 사용
- C에서 메모리 관리의 중요성
C는 무엇입니까?
C를 정의하는 가장 간단한 방법은 컴퓨터 프로그래밍 언어라고 부르는 것입니다. 즉, 컴퓨터가 실행할 수있는 소프트웨어를 작성할 수 있습니다. 그 결과 웹 브라우저와 같은 대형 컴퓨터 응용 프로그램이나 마이크로 프로세서 또는 기타 컴퓨터 구성 요소에 포함 된 작은 명령 집합이 될 수 있습니다.
C 언어는 1970 년대 초 Bell Laboratories에서 개발되었으며 주로 Ken Thompson과 Dennis Ritchie의 작업에 기여했습니다. 프로그래머는 UNIX 운영 체제에 대한보다 사용자 친화적 인 지침 집합이 필요했으며 당시에는 어셈블리 언어로 작성된 프로그램이 필요했습니다. 컴퓨터의 하드웨어와 직접 연결되는 어셈블리 프로그램은 길고 디버깅이 어렵고 새로운 기능을 추가하려면 지루하고 시간이 많이 걸리는 작업이 필요했습니다 [출처 : King].
높은 수준의 언어에 대한 Thompson의 첫 번째 시도는 B라고 불리며, 그 기반이되는 시스템 프로그래밍 언어 BCPL에 대한 찬사입니다. Bell Labs가 DEC (Digital Equipment Corporation) UNIX 시스템 모델 PDP-11을 인수했을 때 Thompson은 새롭고 더 나은 시스템 하드웨어의 요구에 더 잘 맞도록 B를 재 작업했습니다. 그래서 B의 후계자 C가 탄생했습니다. 1973 년에 C는이 혁신적인 새로운 고수준 언어를 사용하여 UNIX 자체를 다시 작성할 수있을만큼 안정적이었습니다 [출처 : King].
C가 Bell Labs를 넘어서 효과적으로 사용되기 전에 다른 프로그래머는 C를 사용하는 방법을 설명하는 문서가 필요했습니다. 1978 년, Brian Kernighan과 Dennis Ritchie의 책 "The C Programming Language"는 C 애호가들에게 K & R 또는 "White Book"으로 알려진 C 프로그래밍의 결정적인 출처가되었습니다. 이 글을 쓰는 시점에서 원래 1988 년에 출판 된 K & R의 두 번째 버전은 여전히 널리 사용 가능합니다. C의 원본, 사전 표준 버전은 그 책을 기반으로 K & R C라고합니다.
사람들이 시간이 지남에 따라 자신의 방언을 만들지 않도록 C 개발자는 1980 년대에 언어 표준을 만들었습니다. C에 대한 미국 표준 인 ANSI (American National Standards Institute) 표준 X3.159-1989가 1989 년에 공식화되었습니다. ISO (International Organization for Standardization) 표준 인 ISO / IEC 9899 : 1990이 1990 년에 이어졌습니다. C 버전 K & R이이 표준과 이후 개정판 (C89, C90 및 C99)을 참조한 후. "ANSI C", "ANSI / ISO C"또는 "ISO C"라고도하는 C89를 볼 수도 있습니다.
C와 UNIX에서의 C 사용은 1980 년대에 걸친 운영 체제 개발의 붐의 일부에 불과했습니다. 이전 제품에 비해 개선 된 모든 점에서 C는 여전히 더 큰 소프트웨어 응용 프로그램을 개발하는 데 사용하기가 쉽지 않았습니다. 컴퓨터가 더욱 강력 해짐에 따라 더 쉬운 프로그래밍 경험에 대한 요구가 증가했습니다. 이러한 요구로 인해 프로그래머는 C를 사용하여 자신의 컴파일러를 구축하고 새로운 프로그래밍 언어를 구축해야했습니다. 이러한 새로운 언어는 움직이는 부분이 많은 복잡한 작업의 코딩을 단순화 할 수 있습니다. 예를 들어, C에서 개발 된 C ++ 및 Java와 같은 언어는 프로그래머의 코드 재사용 능력을 최적화하는 프로그래밍 접근 방식 인 단순화 된 객체 지향 프로그래밍입니다.
이제 약간의 배경 지식을 알았으니 C 자체의 메커니즘을 살펴 보겠습니다.
C 코드 편집 및 컴파일
C는 컴파일 된 언어라고하는 것으로, 코드를 실행하기 전에 컴파일러를 사용하여 코드를 실행 파일로 변환해야합니다. 코드는 하나 이상의 텍스트 파일에 작성되어 Windows의 메모장, Mac의 TextEdit, Linux의 gedit와 같은 텍스트 편집기에서 열고 읽고 편집 할 수 있습니다. 실행 파일은 컴퓨터가 실행 (실행) 할 수있는 것입니다. 컴파일러는 코드에 오류가 있는지 확인하고 오류가없는 것으로 보이면 실행 파일을 만듭니다.
C 코드의 내용을 살펴보기 전에 C 컴파일러를 찾아서 사용할 수 있는지 확인하겠습니다. Mac OS X 및 대부분의 Linux 배포 (예 : Ubuntu)를 사용하는 경우 특정 OS 용 개발 도구 소프트웨어를 설치하면 컴퓨터에 C 컴파일러를 추가 할 수 있습니다. 이러한 무료 C 컴파일러는 명령 줄 도구이므로 일반적으로 터미널 창의 명령 프롬프트에서 실행할 수 있습니다. 이러한 C 컴파일러 중 하나를 실행하는 명령은 "cc"또는 "gcc"와 몇 가지 명령 줄 옵션 및 인수입니다. 즉, Enter 키를 누르기 전에 명령 뒤에 입력되는 것입니다.
Microsoft Windows를 사용 중이거나 명령 줄이 아닌 그래픽 사용자 인터페이스를 사용하려는 경우 C 프로그래밍을위한 IDE (통합 개발 환경)를 설치할 수 있습니다. IDE는 코드를 작성하고, 컴파일하고, 테스트하고, 오류를 빠르게 찾아 수정할 수있는 단일 인터페이스입니다. Windows의 경우 C 및 C ++ 프로그래밍을위한 IDE 인 Microsoft Visual C ++ 소프트웨어를 구입할 수 있습니다. 또 다른 인기있는 IDE는 Eclipse, Windows, Mac 및 Linux에서 실행되는 무료 Java 기반 IDE이며 C 및 기타 여러 프로그래밍 언어를 컴파일하는 데 사용할 수있는 확장 기능이 있습니다.
C의 경우 다른 컴퓨터 프로그래밍 언어와 마찬가지로 사용하는 컴파일러 버전이 매우 중요합니다. 항상 프로그램에서 사용중인 C 언어 버전보다 새롭거나 더 새로운 버전의 C 컴파일러를 사용하려고합니다. IDE를 사용하는 경우 IDE에서 작업중인 프로그램의 대상 C 버전을 사용하고 있는지 확인하도록 설정을 조정해야합니다. 명령 줄에있는 경우 다음 명령과 같이 명령 줄 인수를 추가하여 버전을 변경할 수 있습니다.
gcc –std c99 –o myprogram.exe myprogram.c
위의 명령에서 "gcc"는 컴파일러를 실행하기위한 호출이고 나머지는 모두 명령 줄 옵션 또는 인수입니다. "-std"옵션 뒤에 "c99"가 추가되어 컴파일 중에 C99 표준 버전의 C를 사용하도록 컴파일러에 알립니다. "-o"옵션 뒤에 "myprogram.exe"가 추가되어 컴파일러의 출력 파일 인 실행 파일이 myprogram.exe로 명명되도록 요청했습니다. "-o"가 없으면 실행 파일의 이름이 자동으로 a.out으로 지정됩니다. 마지막 인수 "myprogram.c"는 컴파일 할 C 코드가있는 텍스트 파일을 나타냅니다. 간단히 말해서이 명령은 "이봐, gcc, C99 C 프로그래밍 표준을 사용하여 myprogram.c를 컴파일하고 결과를 myprogram.exe라는 파일에 넣습니다."라고 말합니다.특정 컴파일러에서 사용할 수있는 전체 옵션 목록은 웹에서 gcc이든 다른 것이 든 찾아보십시오.
컴파일러가 설치되면 C로 프로그래밍 할 준비가 된 것입니다. 작성할 수있는 가장 간단한 C 프로그램 중 하나의 기본 구조를 살펴 보겠습니다.
가장 간단한 C 프로그램
간단한 C 프로그램을보고 C 및 C 컴파일 프로세스의 기본 사항을 이해하는 데 모두 사용하겠습니다. 앞서 설명한대로 C 컴파일러가 설치된 컴퓨터가있는 경우 sample.c라는 텍스트 파일을 만들어이 예제를 단계별로 수행하는 데 사용할 수 있습니다. 파일 이름에서 .c를 생략하거나 편집기가 이름에 .txt를 추가하면 컴파일 할 때 일종의 오류가 발생할 수 있습니다.
다음은 샘플 프로그램입니다.
/ * 샘플 프로그램 * /
#포함
int main ()
{
printf ( "이것은 내 첫 번째 프로그램의 출력입니다! \ n");
반환 0;
}
이 프로그램은 컴파일되고 실행될 때 "이것은 내 첫 번째 프로그램에서 출력되었습니다!"라는 줄을 인쇄하도록 컴퓨터에 지시합니다. 그런 다음 중지합니다. 그것보다 훨씬 더 간단해질 수는 없습니다! 이제 각 라인이 수행하는 작업을 살펴 보겠습니다.
1 행-이것은 하나 이상의 행에서 / *와 * / 사이에 C로 주석을 작성하는 한 가지 방법입니다.
2 행-#include 명령은 컴파일러에게 기존 C 코드, 특히 재사용 가능한 공통 명령어를 포함하는 파일 인 라이브러리에 대한 다른 소스를 보도록 지시합니다. 는 사용자로부터 입력을 받고 화면에 출력을 쓰는 함수가있는 표준 C 라이브러리를 참조합니다. 나중에 도서관에 대해 더 자세히 살펴 보겠습니다.
라인 3-이 라인은 함수 정의의 첫 번째 라인입니다. 모든 C 프로그램에는 적어도 하나의 함수 또는 프로그램이 실행될 때 컴퓨터가해야 할 일을 나타내는 코드 블록이 있습니다. 함수는 작업을 수행 한 다음 다른 함수에서 사용할 수있는 반환 값이라는 부산물을 생성합니다. 최소한 프로그램에는 정수를 의미하는 int 데이터 유형의 리턴 값이있는 여기에 표시된 것과 같은 main이라는 함수가 있습니다. 나중에 함수를 자세히 살펴보면 빈 괄호가 무엇을 의미하는지 알 수 있습니다.
4 행과 7 행-함수 내의 명령어는 중괄호로 묶여 있습니다. 일부 프로그래머는 여기에 표시된대로 별도의 행에서 중괄호로 묶인 블록을 시작하고 끝냅니다. 다른 사람들은 함수 정의의 첫 번째 줄 끝에 여는 중괄호 ({)를 넣습니다. 프로그램의 코드 줄을 별도의 줄에 입력 할 필요는 없지만 프로그래머는 코드를 나중에 읽고 편집하기 쉽게 만들기 위해 일반적으로 각 명령어를 별도의 줄에 공백으로 들여 쓰기합니다.
5 행-이것은 printf라는 함수에 대한 함수 호출입니다. 이 함수는 라인 1에 포함 된 stdio.h 라이브러리에 코딩되어 있으므로 직접 작성할 필요가 없습니다. printf에 대한이 호출은 화면에 인쇄 할 내용을 알려줍니다. 하지만 따옴표 안에있는 끝에있는 \ n은 인쇄되지 않습니다. printf에게 커서를 화면의 다음 줄로 이동하도록 지시하는 이스케이프 시퀀스입니다. 또한 보시다시피 함수의 모든 줄은 세미콜론으로 끝나야합니다.
6 행-값을 반환하는 모든 함수는 이와 같은 return 문을 포함해야합니다. C에서 주 함수는 프로그램 내에서 사용되지 않더라도 항상 정수 반환 유형을 가져야합니다. 그러나 C 프로그램을 실행할 때는 기본적으로 기본 기능을 실행하는 것입니다. 따라서 프로그램을 테스트 할 때 프로그램 실행의 반환 값을 표시하도록 컴퓨터에 지시 할 수 있습니다. 프로그래머는 일반적으로 프로그램이 성공적으로 실행되었는지 확인하기 위해 테스트에서 해당 값을 찾기 때문에 반환 값 0이 선호됩니다.
프로그램을 테스트 할 준비가되면 파일을 저장하고 프로그램을 컴파일하고 실행합니다. 명령 줄에서 gcc 컴파일러를 사용하고 프로그램이 sample.c라는 파일에있는 경우 다음 명령으로 컴파일 할 수 있습니다.
gcc -o sample.exe sample.c
코드에 오류가없는 경우이 명령을 실행 한 후 sample.c와 같은 디렉토리에 sample.exe라는 파일이 있어야합니다. 가장 일반적인 오류는 구문 오류입니다. 즉, 줄 끝에서 세미콜론을 생략하거나 닫는 따옴표 나 괄호를 사용하지 않는 등 무언가를 잘못 입력했음을 의미합니다. 변경해야하는 경우 텍스트 편집기에서 파일을 열고 수정 한 다음 변경 사항을 저장하고 컴파일 명령을 다시 시도하십시오.
sample.exe 프로그램을 실행하려면 다음 명령을 입력하십시오. 컴퓨터가 현재 디렉토리에서 실행 파일을 찾도록 강제하는 ./에 유의하십시오.
./sample.exe
다른 C 프로그래밍 리소스에서 컴파일하는 방법에 대해 더 많이 배울 수 있지만 이것이 C 코딩 및 컴파일의 기본입니다. 이제 상자를 열고 프로그램을 빌드하기 위해 C가 갖는 부분을 살펴 보겠습니다.
C의 일반적인 프로그래밍 개념
일반적인 프로그래밍 개념 중 일부를 C 코드에서 실행하는 방법을 살펴 보겠습니다. 다음은 이러한 개념에 대한 간략한 요약입니다.
함수 -앞에서 언급했듯이 함수는 프로그램이 실행될 때 컴퓨터가 수행해야하는 작업을 나타내는 코드 블록입니다. C 프로그래머는 일반적으로 해당 용어를 사용하지 않지만 일부 언어는 이러한 구조 메서드를 호출합니다. 프로그램은 여러 함수를 정의하고 다른 함수에서 해당 함수를 호출 할 수 있습니다. 나중에 C의 함수 구조에 대해 자세히 살펴 보겠습니다.
변수 -프로그램을 실행할 때 값이 무엇인지 미리 알지 못한 채 프로그램을 실행할 수있는 유연성이 필요할 때가 있습니다. 다른 프로그래밍 언어와 마찬가지로 C를 사용하면 유연성이 필요할 때 변수를 사용할 수 있습니다. 대수의 변수와 마찬가지로 컴퓨터 프로그래밍의 변수는 아직 알지 못하거나 아직 찾지 못한 값을 나타내는 자리 표시 자입니다.
데이터 유형 -프로그램이 실행되는 동안 메모리에 데이터를 저장하고 해당 데이터에 대해 수행 할 수있는 작업을 파악하기 위해 C와 같은 프로그래밍 언어는 인식 할 특정 데이터 유형을 정의합니다. C의 각 데이터 유형은 이진 비트 또는 바이트로 측정되는 특정 크기와 해당 비트가 나타내는 것에 대한 특정 규칙 세트를 가지고 있습니다. 이제 C를 사용할 때 작업에 적합한 데이터 유형을 선택하는 것이 얼마나 중요한지 살펴 보겠습니다.
연산 -C에서는 숫자에 대한 산술 연산 (예 : 더하기)과 문자열에 대한 문자열 연산 (예 : 연결)을 수행 할 수 있습니다. C에는 또한 데이터로 수행하려는 작업을 위해 특별히 설계된 기본 제공 작업이 있습니다. C에서 데이터 유형을 확인할 때 작업도 간략하게 살펴 보겠습니다.
루프 -프로그래머가하고 싶은 가장 기본적인 것 중 하나는 프로그램이 실행되는 동안 발생하는 특정 조건에 따라 작업을 몇 번 반복하는 것입니다. 주어진 조건에 따라 반복되도록 설계된 코드 블록을 루프라고하며 C 언어는 while, do / while, for, continue / break 및 goto와 같은 일반적인 루프 구조를 제공합니다. C에는 일반적인 if / then / else 조건 및 switch / case 문도 포함됩니다.
데이터 구조 -프로그램에 처리 할 데이터가 많고 해당 데이터를 정렬하거나 검색해야하는 경우 일종의 데이터 구조를 사용할 수 있습니다. 데이터 구조는 동일한 데이터 유형의 여러 데이터 조각을 나타내는 구조화 된 방법입니다. 가장 일반적인 데이터 구조는 주어진 크기의 색인화 된 목록 인 배열입니다. C에는 몇 가지 공통 데이터 구조를 처리하는 데 사용할 수있는 라이브러리가 있지만 항상 함수를 작성하고 고유 한 구조를 설정할 수도 있습니다.
전 처리기 작업 -때로는 코드를 실행 파일로 컴파일하기 전에 코드로 수행 할 작업에 대한 지침을 컴파일러에 제공 할 수 있습니다. 이러한 작업에는 상수 값 대체 및 C 라이브러리의 코드 포함 (이전 샘플 코드에서 확인)이 포함됩니다.
C는 또한 프로그래머가 많은 프로그래밍 언어가 단순화하거나 자동화 한 일부 개념을 처리하도록 요구합니다. 여기에는 포인터, 메모리 관리 및 가비지 수집이 포함됩니다. 이후 페이지에서는 C로 프로그래밍 할 때 이러한 개념에 대해 알아야 할 중요한 사항을 다룹니다.
이 빠른 개념 개요는 아직 프로그래머가 아니라면 압도적으로 보일 수 있습니다. 조밀 한 C 프로그래밍 가이드를 다루기 전에 함수부터 시작하여 위에 나열된 핵심 개념을 사용자 친화적으로 살펴 보겠습니다.
C의 기능
대부분의 컴퓨터 프로그래밍 언어를 사용하면 일종의 함수를 만들 수 있습니다. 함수를 사용하면 긴 프로그램을 명명 된 섹션으로 분할하여 프로그램 전체에서 해당 섹션을 재사용 할 수 있습니다. 일부 언어의 프로그래머, 특히 객체 지향 프로그래밍 기술을 사용하는 프로그래머 는 function 대신 method 라는 용어를 사용합니다 .
함수는 매개 변수를 받아들이고 결과를 반환합니다. 함수를 구성하는 코드 블록은 함수 정의입니다. 다음은 함수 정의의 기본 구조입니다.
{
반환
}
최소한 C 프로그램에는 main이라는 함수가 하나 있습니다. 컴파일러는 프로그램의 시작점으로 main 함수가 다른 함수를 호출하더라도 메인 함수를 찾습니다. 다음은 이전에 살펴본 간단한 C 프로그램에서 본 주요 내용입니다. 반환 유형은 정수이고, 매개 변수가 없으며, 두 개의 문 (함수 내 명령어)이 있으며, 그중 하나는 return 문입니다.
int main ()
{
printf ( "이것은 내 첫 번째 프로그램의 출력입니다! \ n");
반환 0;
}
main 이외의 함수에는 정의와 하나 이상의 함수 호출이 있습니다. 함수 호출은 다른 함수 내의 명령문 또는 명령문의 일부입니다. 함수 호출은 호출하는 함수의 이름을 괄호로 묶습니다. 함수에 매개 변수가있는 경우 함수 호출에는 해당 매개 변수와 일치하는 해당 값이 포함되어야합니다. 함수 호출의이 추가 부분을 함수에 매개 변수 전달이라고합니다.
그러나 매개 변수는 무엇입니까? 함수에 대한 매개 변수는 함수가 작업을 수행하는 데 필요한 특정 데이터 유형의 데이터 조각입니다. C의 함수는 인수라고도하는 매개 변수를 무제한으로 허용 할 수 있습니다. 함수 정의에 추가 된 각 매개 변수는 데이터 유형과 함수 블록 내의 변수 이름의 두 가지를 지정해야합니다. 여러 매개 변수는 쉼표로 구분됩니다. 다음 함수에는 정수인 두 개의 매개 변수가 있습니다.
int doubleAndAdd (int a, int b)
{
return ((2 * a) + (2 * b));
}
다음으로, 축소하여 더 큰 C 프로그램에 어떻게 맞는지 살펴보면서 함수를 계속 살펴 보겠습니다.
기능 프로토 타입
C에서는 프로그램 내의 모든 위치에 함수 정의를 추가 할 수 있습니다 (다른 함수 내에서는 제외). 유일한 조건은 함수가 나중에 코드 어딘가에 존재한다는 것을 컴파일러에 미리 알려야한다는 것입니다. 프로그램 시작 부분에 함수 프로토 타입을 사용하여이 작업을 수행합니다. 프로토 타입은 정의의 첫 번째 줄과 유사한 문장입니다. C에서는 프로토 타입의 매개 변수 이름을 제공 할 필요가없고 데이터 유형 만 제공합니다. 다음은 doubleAndAdd 함수에 대한 함수 프로토 타입의 모습입니다.
int doubleAndAdd (int, int);
함수 프로토 타입을 프로그램의 패킹리스트로 상상해보십시오. 컴파일러는 새 책장을 풀고 어셈블하는 것처럼 프로그램의 압축을 풀고 어셈블합니다. 포장 목록은 책장 조립을 시작하기 전에 상자에 필요한 모든 부품이 있는지 확인하는 데 도움이됩니다. 컴파일러는 프로그램 어셈블을 시작하기 전에 동일한 방식으로 함수 프로토 타입을 사용합니다.
앞에서 살펴본 sample.c 프로그램을 따라가는 경우 파일을 열고 편집하여 여기에 표시된 doubleAndAdd 함수에 대한 함수 프로토 타입, 함수 정의 및 함수 호출을 추가합니다. 그런 다음 이전과 같이 프로그램을 컴파일하고 실행하여 새 코드가 어떻게 작동하는지 확인하십시오. 다음 코드를 가이드로 사용하여 사용해 볼 수 있습니다.
#포함
int doubleAndAdd (int, int);
int main ()
{
printf ( "이것은 내 첫 번째 프로그램의 출력입니다! \ n");
printf ( "두 배로 2와 3을 더하면 결과는 다음과 같습니다. % d \ n", doubleAndAdd (2,3));
반환 0;
}
int doubleAndAdd (int a, int b)
{
return ((2 * a) + (2 * b));
}
지금까지 C 프로그램의 몇 가지 기본 구조 요소를 살펴 보았습니다. 이제 C 프로그램에서 작업 할 수있는 데이터 유형과 해당 데이터에 대해 수행 할 수있는 작업을 살펴 보겠습니다.
함수 선언
C에서는 특히 이전 C 프로그래머 사이에서 함수 프로토 타입보다 함수 선언이라는 용어를 더 많이 듣게 될 것입니다. 하지만이 기사에서는 함수 프로토 타입이라는 용어를 사용합니다. 중요한 차이점이 있기 때문입니다. 원래 함수 선언에는 매개 변수가 필요하지 않았으므로 반환 유형, 함수 이름 및 한 쌍의 빈 괄호로 충분했습니다. 하지만 함수 프로토 타입은 호출 할 매개 변수의 수와 데이터 유형을 포함하여 컴파일러에게 중요한 추가 정보를 제공합니다. 프로토 타입은 오늘날 C 및 기타 프로그래밍 언어에서 코더들 사이에서 모범 사례 접근 방식이되었습니다.
C의 데이터 유형 및 연산
컴퓨터의 관점에서 데이터는 하드 드라이브 나 컴퓨터의 프로세서 또는 메모리에있는 전자 비트의 켜짐 및 꺼짐 상태를 나타내는 일련의 1과 0에 불과합니다. 수십억 개의 이진수를 이해하는 방법을 결정하는 것은 컴퓨터에서 실행중인 소프트웨어입니다. C는 주어진 데이터 유형을 기반으로 데이터를 해석하는 것 외에도 비트 수준에서 데이터를 쉽게 조작 할 수있는 몇 안되는 고급 언어 중 하나입니다.
데이터 유형은 일련의 비트를 이해하는 방법을 나타내는 작은 규칙 집합입니다. 데이터 유형에는 특정 크기와 해당 유형의 데이터에 대한 작업 (예 : 더하기 및 곱하기)을 수행하는 자체 방법이 있습니다. C에서 데이터 유형의 크기는 사용중인 프로세서와 관련이 있습니다. 예를 들어, C99에서 정수 데이터 유형 (int)의 데이터 조각은 16 비트 프로세서에서 16 비트 길이이고 32 비트 및 64 비트 프로세서에서는 32 비트 길이입니다.
C 프로그래머가 알아야 할 또 다른 중요한 사항은 언어가 서명 된 데이터 유형과 서명되지 않은 데이터 유형을 처리하는 방법입니다. 부호있는 유형은 비트 중 하나가 양수인지 음수인지에 대한 표시기로 예약되어 있음을 의미합니다. 따라서 16 비트 시스템의 unsigned int는 0에서 65,535 사이의 숫자를 처리 할 수 있지만 동일한 시스템에서 로그인하면 -32,768에서 32,767 사이의 숫자를 처리 할 수 있습니다. 연산으로 인해 int 변수가 범위를 벗어나는 경우 프로그래머는 추가 코드로 오버플로를 처리해야합니다.
이러한 제약 조건과 C 데이터 유형 및 작업의 시스템 특정 특성을 고려할 때 C 프로그래머는 프로그램의 요구 사항에 따라 데이터 유형을 선택해야합니다. 선택할 수있는 데이터 유형 중 일부는 C 프로그래밍 언어에 내장 된 것을 의미하는 C의 기본 데이터 유형입니다. C의 전체 데이터 유형 목록과 데이터를 한 유형에서 다른 유형으로 변환하는 방법에 대한 중요한 정보는 좋아하는 C 프로그래밍 가이드를 참조하십시오.
C 프로그래머는 원시 데이터 유형과 데이터를 구성하고 조작하는 방법을 정의하는 함수 집합을 결합하는 데이터 구조를 만들 수도 있습니다. 데이터 구조의 사용은 고급 프로그래밍 주제이며이 기사의 범위를 벗어나지 만 가장 일반적인 구조 중 하나 인 배열을 살펴 보겠습니다. 어레이는 데이터 유형이 모두 동일한 데이터 조각을 포함하는 가상 목록입니다. 배열의 크기는 변경할 수 없지만 그 내용은 더 크거나 작은 다른 배열에 복사 할 수 있습니다.
프로그래머는 종종 숫자 배열을 사용하지만 문자열이라고하는 문자 배열에는 가장 독특한 기능이 있습니다. 문자열을 사용하면 "안녕하세요"와 같은 말을 일련의 문자로 저장할 수 있으며, C 프로그램은 사용자로부터 읽거나 화면에 인쇄 할 수 있습니다. 문자열 조작에는 고유 한 작업 집합이 있으며 일반적인 문자열 함수를 사용하는 전용 C 라이브러리 (string.h)가 있습니다.
C의 기본 제공 작업은 대부분의 프로그래밍 언어에서 찾을 수있는 일반적인 작업입니다. 여러 연산을 단일 문으로 결합 할 때 연산자 우선 순위 또는 프로그램이 수학 표현식에서 각 연산을 수행하는 순서를 알아야합니다. 예를 들어, (2 + 5) * 3은 21과 같고 2 + 5 * 3은 17과 같습니다. 왜냐하면 달리 나타내는 괄호가 없으면 C는 더하기 전에 곱하기를 수행하기 때문입니다.
C를 배우는 경우 모든 기본 데이터 유형 및 작업과 동일한 표현식의 작업 우선 순위를 숙지하는 것이 우선입니다. 또한 다양한 데이터 유형의 변수와 수에 대해 다양한 연산을 실험 해보십시오.
이 시점에서 몇 가지 중요한 C 기본 사항의 표면을 긁어 보았습니다. 다음으로, C를 사용하여 매번 처음부터 시작하지 않고 프로그램을 작성하는 방법을 살펴 보겠습니다.
처음부터 시작하지 말고 라이브러리 사용
C 언어는 필요한 가장 기본적인 기능 만 지원하기 때문에 C에서 라이브러리는 매우 중요합니다. 예를 들어 C에는 키보드에서 읽고 화면에 쓰는 입출력 (I / O) 함수가 없습니다. 기본을 넘어서는 모든 것은 프로그래머가 작성해야합니다. 코드 덩어리가 여러 다른 프로그램에 유용하다면 쉽게 재사용 할 수 있도록 라이브러리에 넣는 경우가 많습니다.
지금까지 C에 대한 논의에서 표준 I / O (stdio) 라이브러리라는 하나의 라이브러리를 이미 보았습니다. 프로그램 시작 부분의 #include 줄은 C 컴파일러에게 stdio.h라는 헤더 파일에서 라이브러리를로드하도록 지시했습니다. C 관리자에는 I / O, 수학 함수, 시간 조작 및 문자열과 같은 특정 데이터 구조에 대한 일반적인 작업을위한 표준 C 라이브러리가 포함됩니다. C89 표준 라이브러리 및 C99의 업데이트 및 추가 사항에 대한 정보는 웹 또는 즐겨 찾는 C 프로그래밍 가이드를 검색하십시오.
당신도 C 라이브러리를 작성할 수 있습니다. 이렇게하면 프로그램을 재사용 가능한 모듈로 분할 할 수 있습니다. 이러한 모듈 식 접근 방식은 여러 프로그램에 동일한 코드를 쉽게 포함 할 수있을뿐만 아니라 읽기, 테스트 및 디버그가 더 쉬운 짧은 프로그램 파일을 만들 수 있습니다.
헤더 파일 내에서 함수를 사용하려면 프로그램 시작 부분에 #include 행을 추가하십시오. 표준 라이브러리의 경우보다 큼 및보다 작음 기호 () 사이에 라이브러리의 해당 헤더 파일 이름을 넣으십시오. 직접 생성 한 라이브러리의 경우 파일 이름을 큰 따옴표로 묶습니다. C 프로그램의 다른 부분에있는 문과 달리 각 줄 끝에 세미콜론을 넣을 필요가 없습니다. 다음은 각 라이브러리 유형 중 하나를 포함하는 것을 보여줍니다.
#포함
#include "mylib.h"
포괄적 인 C 프로그래밍 소스는 C로 자신의 라이브러리를 작성하는 데 필요한 지침을 제공해야합니다. 작성할 함수 정의는 라이브러리에 있든 메인 프로그램에 있든 다르지 않습니다. 차이점은 개체 파일 (.o로 끝나는 이름)이라는 개체 파일에서 별도로 컴파일하고 다음을 포함하는 헤더 파일 (.h로 끝나는 이름)이라는 두 번째 파일을 생성한다는 것입니다. 라이브러리의 각 함수에 해당하는 함수 프로토 타입. 라이브러리를 사용하는 각 기본 프로그램의 #include 줄에서 참조 할 헤더 파일이며 해당 프로그램을 컴파일 할 때마다 컴파일러 명령에 개체 파일을 인수로 포함합니다.
지금까지 살펴본 C 기능은 다른 프로그래밍 언어에서도 일반적입니다. 다음으로 C가 컴퓨터 메모리를 관리하는 방법에 대해 설명하겠습니다.
C의 포인터에 대한 몇 가지 포인터
C 프로그램이 메모리 (일반적으로 컴퓨터의 RAM 또는 랜덤 액세스 메모리)에로드되면 프로그램의 각 부분이 메모리의 주소와 연결됩니다. 여기에는 특정 데이터를 보유하는 데 사용하는 변수가 포함됩니다. 프로그램이 함수를 호출 할 때마다 해당 함수를 실행하고 값을 반환하기에 충분한 시간 동안 해당 함수와 모든 관련 데이터를 메모리에로드합니다. 함수에 매개 변수를 전달하면 C는 함수에서 사용할 값의 사본을 자동으로 만듭니다.
하지만 함수를 실행할 때 원래 메모리 위치의 데이터를 영구적으로 변경하고 싶을 때가 있습니다. C가 함수에서 사용할 데이터의 복사본을 만들면 원래 데이터는 변경되지 않습니다. 원본 데이터를 변경하려면 해당 값을 함수에 전달 (값 전달)하는 대신 포인터를 메모리 주소 (참조로 전달)에 전달해야합니다.
포인터는 C의 모든 곳에서 사용되므로 C 언어를 완전히 사용하려면 포인터를 잘 이해해야합니다. 포인터는 다른 변수와 같은 변수이지만 그 목적은 다른 데이터의 메모리 주소를 저장하는 것입니다. 포인터에는 데이터 유형도 있으므로 해당 메모리 주소에서 비트를 인식하는 방법을 알고 있습니다.
C 코드에서 두 개의 변수를 나란히 살펴보면 포인터를 항상 인식하지 못할 수 있습니다. 이것은 경험이 많은 C 프로그래머에게도 도전이 될 수 있습니다. 하지만 처음 포인터를 만들 때는 변수 이름 바로 앞에 별표가 있어야하기 때문에 더 분명합니다. 이를 C에서는 간접 연산자라고합니다. 다음 예제 코드는 정수 i와 정수 p에 대한 포인터를 만듭니다.
int i;
int * p;
현재 i 또는 p에 할당 된 값이 없습니다. 다음으로 i에 값을 할당 한 다음 i의 주소를 가리 키도록 p를 할당합니다.
나는 = 3;
p = & i;
여기서 i 바로 앞에 주소 연산자로 사용되는 앰퍼샌드 (&)를 볼 수 있습니다. 즉, "i의 주소"를 의미합니다. 할당을하기 위해 그 주소가 무엇인지 알 필요는 없습니다. 프로그램을 실행할 때마다 다를 수 있기 때문에 좋습니다! 대신 주소 연산자는 프로그램이 실행되는 동안 해당 변수와 관련된 주소를 결정합니다. 주소 연산자가 없으면 p = i 대입은 p에 변수 i의 메모리 주소가 아니라 문자 그대로 3의 메모리 주소를 할당합니다.
다음으로 C 코드에서 포인터를 사용하는 방법과 준비해야 할 과제를 살펴 보겠습니다.
C에서 올바르게 포인터 사용
포인터가 있으면 작업 및 함수 호출에서 동일한 데이터 유형의 변수 대신 포인터를 사용할 수 있습니다. 다음 예제에서는 더 큰 작업 내에서 i 대신 i에 대한 포인터가 사용됩니다. p (* p)와 함께 사용되는 별표는 연산이 메모리 주소 자체가 아니라 해당 메모리 주소에서 p가 가리키는 값을 사용해야 함을 나타냅니다.
int b;
b = * p + 2;
포인터가 없으면 C 프로그램에서 작업을 main 외부의 함수로 나누는 것이 거의 불가능합니다. 이를 설명하기 위해 사용자의 키를 가장 가까운 센티미터에 저장하는 h라는 변수를 main에 생성했다고 가정 해 보겠습니다. 또한 사용자에게 해당 높이 값을 설정하라는 메시지를 표시하는 setHeight라는 이름의 함수를 호출합니다. 주 함수의 행은 다음과 같습니다.
int h;
setHeight (h); / * 여기에 잠재적 인 문제가 있습니다. * /
이 함수 호출은 h 값을 setHeight에 전달하려고합니다. 그러나 함수 실행이 완료되면 함수가 복사본 만 사용하고 실행이 완료되면 버려 지므로 h 값은 변경되지 않습니다.
h 자체를 변경하려면 먼저 함수가 값의 새 복사본이 아닌 기존 값에 대한 포인터를 사용할 수 있는지 확인해야합니다. 그러면 setHeight의 첫 번째 줄은 값 대신 포인터를 매개 변수로 사용합니다 (간접 연산자 참고).
setHeight (int * height) {/ * 함수 문은 여기로 이동 * /}
그런 다음 setHeight를 호출하기위한 두 가지 선택 사항이 있습니다. 첫 번째는 h에 대한 주소 연산자를 전달 된 매개 변수 (& h)로 사용하는 것입니다. 다른 하나는 h에 대한 별도의 포인터를 만들고 대신 전달하는 것입니다. 다음은 두 가지 옵션을 모두 보여줍니다.
setHeight (& h); / * h의 주소를 함수에 전달 * /
int * p;
p = & h;
setHeight (p); / * h의 주소에 대한 별도의 포인터를 함수에 전달 * /
두 번째 옵션은 포인터를 사용할 때 일반적인 문제를 보여줍니다. 문제는 동일한 값에 대한 여러 포인터를 갖는 것입니다. 이것은 한 값의 변경이 모든 포인터에 한 번에 영향을 미친다는 것을 의미합니다. 이것은 프로그램에서 수행하려는 작업에 따라 좋은 것일 수도 있고 나쁜 것일 수도 있습니다. 다시 말하지만, 포인터 사용을 마스터하는 것은 C 프로그래밍을 마스터하는 데 중요한 열쇠입니다. 가능한 한 많은 포인터로 연습하여 이러한 도전에 맞설 준비를하십시오.
지금까지 살펴본 C 기능은 다른 프로그래밍 언어에서도 일반적입니다. 다음으로, 신중한 메모리 관리에 대한 C의 요구 사항을 살펴 보겠습니다.
C에서 메모리 관리의 중요성
C를 다목적 언어로 만드는 것 중 하나는 프로그래머가 아주 적은 양의 메모리로 실행되도록 프로그램을 축소 할 수 있다는 것입니다. C가 처음 작성되었을 때 컴퓨터가 오늘날만큼 강력하지 않았기 때문에 이것은 중요한 기능이었습니다. 휴대 전화에서 소형 의료 기기에 이르기까지 소형 전자 제품에 대한 현재의 수요로 인해 일부 소프트웨어의 메모리 요구 사항을 작게 유지하려는 새로운 관심이 있습니다. C는 메모리 사용에 대한 많은 제어가 필요한 대부분의 프로그래머에게 자주 사용되는 언어입니다.
메모리 관리의 중요성을 더 잘 이해하려면 프로그램이 메모리를 사용하는 방법을 고려하십시오. 프로그램을 처음 실행하면 컴퓨터의 메모리에로드되고 컴퓨터의 프로세서에서 명령을 보내고 받음으로써 실행을 시작합니다. 프로그램이 특정 기능을 실행해야 할 때 실행 기간 동안 해당 기능을 메모리의 다른 부분에로드 한 다음 기능이 완료되면 해당 메모리를 버립니다. 또한 메인 프로그램에서 사용되는 각각의 새로운 데이터는 프로그램이 진행되는 동안 메모리를 차지합니다.
이 모든 것을 더 잘 제어하려면 동적 스토리지 할당이 필요합니다. C는 필요에 따라 메모리를 예약하고 사용을 마치는 즉시 해당 메모리를 해제하는 기능인 동적 저장소 할당을 지원합니다. 많은 프로그래밍 언어에는 이러한 메모리 관리 작업을 처리하는 자동 메모리 할당 및 가비지 컬렉션이 있습니다. 그러나 C에서는 표준 C 라이브러리의 다음 주요 기능을 사용하여 메모리 할당에 대해 명시 적으로 지정할 수 있습니다 (필요한 경우도 있음).
- malloc-메모리 할당의 약자 인 malloc 은 프로그램이 처리해야하는 특정 유형의 데이터를 스토리하기 위해 주어진 크기의 메모리 블록을 예약하는 데 사용됩니다. malloc을 사용할 때 할당 된 메모리에 대한 포인터를 생성합니다. 이것은 처음 선언하자마자 할당되는 하나의 정수와 같은 단일 데이터 조각에는 필요하지 않습니다 (int i에서와 같이). 그러나 배열과 같은 데이터 구조를 만들고 관리하는 데 중요한 부분입니다. C의 대체 메모리 할당 옵션은 예약 될 때 메모리를 지우는 calloc 과 이전에 예약 된 메모리의 크기를 조정하는 realloc 입니다.
- free-free를 사용하여 프로그램이 이전에 주어진 포인터에 할당 된 메모리를 해제하도록합니다.
malloc 및 free를 사용할 때 가장 좋은 방법은 할당 한 모든 항목을 해제해야한다는 것입니다. 임시 기능에서도 무언가를 할당 할 때마다 운영 체제가 공간을 정리할 때까지 메모리에 남아 있습니다. 그러나 메모리가 비어 있고 즉시 사용할 준비가되었는지 확인하려면 현재 함수가 종료되기 전에 메모리를 해제해야합니다. 이 메모리 관리는 프로그램의 메모리 공간을 최소로 유지하고 메모리 누수를 방지 할 수 있음을 의미합니다. 메모리 누수는 할당 할 메모리가 남지 않을 때까지 계속해서 더 많은 메모리를 사용하여 프로그램이 중단되거나 충돌하는 프로그램 결함입니다. 다른 한편으로, 메모리를 확보하는 것에 대해 너무 걱정하지 마십시오. 따라서 동일한 기능에서 나중에 필요한 것을 확보하여 잃게됩니다.
이 기사를 통해 C 프로그래밍 언어의 기본 구조와 핵심 개념 중 일부를 배웠습니다. 우리는 그 역사, 다른 프로그래밍 언어와 공통된 특징 및 코딩 소프트웨어를위한 독특하고 다양한 옵션을 만드는 중요한 기능을 살펴 보았습니다. 다음 페이지로 이동하여 C 로의 여정을 더욱 발전시킬 수있는 프로그래밍 가이드를 포함하여 더 많은 정보를 얻으십시오.
더 많은 정보
관련 기사
- C 프로그래밍의 기초
- Java 작동 방식
- 부울 논리의 작동 방식
- PERL 작동 방식
- BIOS 작동 방식
- CGI 스크립팅의 작동 원리
- 비트 및 바이트 작동 방식
더 멋진 링크
- C Programming.com 튜토리얼
- 위키 북의 C 프로그래밍
- GNU 컴파일러 컬렉션 (GCC)
- Eclipse 통합 개발 환경 소프트웨어
출처
- Kernighan, Brian W. 및 Ritchie, Dennis M. "C Programming Language, Second Edition." 프렌 티스 홀. 1988.
- King, KN "C 프로그래밍 : 현대적인 접근 방식, 제 2 판." WW Norton & Company, Inc. 2008.