기본 콘텐츠로 건너뛰기

8월, 2012의 게시물 표시

매개변수

Call by nameintfunc1()
Call by valueintfunc1(int a, ...)
Call by addressintfunc1(int *a, ...)
Call by reference 호출함수
intfunc1(&a, &b)
피호출함수
intfunc1(int *a, int *b)

연산자 우선 순위

()(괄호)[](배열)->(포인터멤버).(구조체멤버)

!(부정)~(1의보수)++(증가) --(감소)-(부호) +(부호) (자료형)(형변환) *(포인터) &(주소) sizeof

*(곱셈)/(나눗셈)%(나머지)

+(덧셈)-(뺄셈)

<< >>(비트이동)

< <= >>=(관계)

== !=(관계)

&(비트논리곱)

^(비트배타논리합)

|(비트논리합)

&&(논리곱)

||(논리합)

?:(조건)

=(할당)+= -= *=/=%=&=^= |= <<=>>=(복합할당)

,(쉼표)

Error와 Warning

Error소스 파일 번역시에 문법 상의 오류인 때에 출력. 에러가 있는 경우에는 링킹을 한다거나 실행할 수 없다.Warning번역 또는 링킹시에 발생. 경미한 오류인 경우에 출력. 경고를 무시해도 실행파일이 생성된다.

전처리기

컴파일러에 앞서서 사용자가 정의한 각종 내용을 미리 처리한다.
반드시 #으로 시작하며 문장의 끝에는 세미콜론이 붙지 않는다.
소스 파일의 첫 부분에 위치하며, 첫 칸부터 시작해서 입력하고 한 줄에 하나씩의 명령을 입력한다.

#include 헤더파일 등을 포함. 컴파일러의 기본 경로에 있는 파일은 < >안에, 현재 소스의 경로에 있는 때에는 " "안에 파일명을 입력한다.

#define 매크로를 정의. 선행처리기는 매크로와 대응하는 내용을 빈칸을 통해서 구분한다.
매크로 상수 1 #define PI 3.141592 매크로 함수 1 #define SQUARE(x) ((x)*(x)) 2 #define PRINTOUT(x) printf(#x) 매개변수에 따옴표를 포함시키려면 #을 붙인다.

#if, #elif, #else, #endif, #ifdef, #ifndef 조건부 컴파일 1 #if 조건1 2 문장1 3 #elif 조건2 4 문장2 5 #else 6 문장3 7 #endif


내장된 매크로__DATE__컴파일 날짜__TIME__컴파일 시간__LINE__소스 코드의 줄번호__FILE__현재 소스 파일의 이름

Example : 1 #include <stdio.h> 2 3 /* 4 매크로 함수 5 */ 6 #define PRINTLN(x) printf("%s\n",x) 7 #define PRINTOUT(x) printf(#x) 8 9 intmain()10 {11 char str1[] ="String 1.";12 13 PRINTLN(str1);14 PRINTOUT(String 2.);15 16 system("PAUSE");17 return0;18 }

기억부류

변수에 저장된 값이 유효하게 사용될 수 있는 프로그램 내에서의 범위를 변수의 범위라고 한다. 변수의 사용영역에 따라 지역변수, 전역변수로 나뉠 수 있고, 변수의 존속기간에 따라 자동변수, 정적변수, 외부변수, 레지스터변수로 나뉠 수 있다.

외부 변수 전역 변수라고도 하며, 다른 함수에서 정의된 변수를 공유하고자 할 때 사용한다.
함수의 밖에서 선언되며, 여러 소스 파일 간에 사용하려는 때에는 extern 키워드를 사용한다. extern은 실제로 변수를 선언하는 것이 아니라 다른 파일에서 변수가 선언되었음을 알려주는 역할을 한다.
초기화되지 않은 경우에 0값을 가짐. 외부변수와 프로그램 데이터가 저장되는 데이터 세그먼트에 저장된다.
1 #include <stdio.h> 2 3 /* 4 외부변수 5 */ 6 7 int x =100; 8 9 voidfun1()10 {11 printf("fun1 : x = %d\n", x);12 x =200;13 }14 15 intmain()16 {17 18 printf("main : x = %d\n", x);19 fun1();20 printf("main : x = %d\n", x);21 system("PAUSE");22 return0;23 }
1 #include <stdio.h> 2 3 /* 4 extern 전역변수 #1 5 */ 6 voidfun2(void); 7 8 int x =100; 9 10 voidfun1()11 {12 printf("fun1 : x = %d\n", x);13 x =200;14 }15 16 intmain()17 {18 printf("main : x = %d\n", x);19 fun1();20 fun2();21 printf("main : x = %d\n", x);22 system("PAUSE");23 ret…

구조체

구조체란 여러가지 자료형을 묶어놓은 집합적인 자료형이다.

구조체의 정의 1 struct 구조체명 2 { 3 int x; 4 int y; 5 }


구조체의 선언 1 struct animal 2 { 3 ... 4 } dog, cat;
1 struct animal 2 { 3 ... 4 } 5 ... 6 struct animal dog, cat;


구조체의 초기화 1 struct animal 2 { 3 int color; 4 ... 5 } dog = {.., .., ..};


구조체의 멤버 구조체의 멤버를 사용하려면 .연산자를 사용한다.
1 dog.color;

구조체를 멤버로 가지는 구조체 필요한만큼 .연산자를 사용하면 된다.
1 record.topleft.x =100;

배열을 멤버로 가지는 구조체 1 record.x[1] =100;


포인터를 멤버로 가지는 구조체



구조체의 배열 1 struct animal dog[100]; 2 dog[1].color;

구조체의 포인터 -> : 구조체 포인터의 멤버 연산자
1 struct part* p_part; 2 struct part gizmo; 3 p_part = &gizmo; 4 p_part->number =100;

자료형의 정의 1 typedefstruct 2 { 3 ... 4 } animal; 5 6 animal dog, cat;

공용체

공용체는 하나의 메모리 공간을 여러 개의 자료형이나 변수가 공유하는 것이다.

정의 union 키워드를 사용하며, 공용체의 멤버는 반드시 정수형이거나 문자형이어야 한다. 각각의 멤버는 전체 길이가 같아야 한다.
1 union REG 2 { 3 int ax; 4 short ah, al; 5 }

멤버의 사용 구조체와 마찬가지로 .연산자를 사용해서 멤버에 접근할 수 있다.

포인터

포인터는 다른 변수의 주소값을 가지는 특별한 변수이다.
*는 포인터의 내용 연산자이다.
&는 포인터의 주소 연산자이다.

 일반 변수포인터 변수  선언 int a; // 정수형 변수 a int *a; // 포인터 변수 a를 종수형으로 선언 값 할당 int a = 100; // 변수 a에 100할당 *a = 100; // a 주소에 100 할당 주소 참조 &a; // 변수 a의 주소 a; // 주소 주소 연산 할 수 없음 a--; // 포인터를 1 감소


선언 1 자료형* 포인터변수명;
1 int* p;
변수 p는 포인터 변수이며, 정수형의 값을 가지는 변수에 대한 주소를 가진다.
선언시에 사용되는 *는 내용 연산자가 아니다.


초기화 포인터 변수는 반드시 초기화 후에 사용해야 한다.
1 int* p; 2 int i; 3 p = &i;

포인터 변수의 크기 포인터 변수의 자료형은 포인터가 가르키는 변수의 자료형이다. 포인터 변수의 크기는 포인터가 가르키는 자료형의 크기와 무관하다.
1 #include <stdio.h> 2 3 /* 4 포인터의 크기 5 */ 6 7 intmain() 8 { 9 int i =4;10 int* p_i = &i;11 char ch ='a';12 char* p_ch = &ch;13 double dbl =1.0;14 double* p_dbl = &dbl;15 16 printf("%d\n",sizeof(p_i));17 printf("%d\n",sizeof(p_ch));18 printf("%d\n",sizeof(p_dbl));19 20 system("PAUSE");21 return0;22 }

배열과 포인터 배열 arr[]의 이름인 arr는 배열의 첫번째 요소인 arr[0]의 주소이다. 따라서, data==&data[0]이다.


포인터 연산 포인터에 저장된 주소값을 변경하는 연산이다. 포인터의 값을…

배열

배열은 동일한 자료형으로 구성된 기억 장소의 집합이다. 배열 내의 특정 위치를 지칭하기 위해서 첨자를 사용한다. 배열의 첨자는 대괄호 [ ]로 표현한다. 배열의 요소는 항상 0부터 시작하며, 마지막 요소의 번호는 n-1이 된다. 배열명은 배열의 시작 주소이다.
1 자료형 배열명[갯수];


다차원 배열 2차원 배열은 2개의 첨자를 가지며, 3차원 배열은 3개의 첨자를 가진다. 배열의 차원에는 제한이 없다.
2차원 배열의 요소는 1차원 배열이다. 2차원 배열에서 행의 숫자는 생략할 수 있다.

1 자료형 배열명[갯수][갯수];


초기화 1 int arr[4] = {10,20,30,40}; 2 int arr[] = {10,20,30,40}; 3 int arr[4][2] = {10,20,30,40,50,60,70,80}; 4 int arr[4][2] = {{10,20}, {30,40}, {50,60}, {70,80}}; 5 int arr[4] = {10,20,30, };// 쉼표를 사용하면 마지막 요소는 0으로 초기화된다.


배열의 크기 1 #include <stdio.h> 2 3 /* 4 배열의 크기 5 */ 6 7 intmain() 8 { 9 int arr[] = {1,2,3,4};10 11 printf("%d\n",sizeof(arr)/sizeof(int));12 13 system("PAUSE");14 return0;15 }


문자의 배열 문자열을 저장하기 위해서는 문자형배열을 이용할 수도 있고, 포인터를 이용할 수도 있다. 배열의 이름은 포인터의 역할을 하므로, 두 가지는 실제로 같은 것이라 볼 수 있다.
문자열의 마지막에는 널문자가 포함되야 하므로, 문자형 배열의 크기는 실제 문자의 갯수보다 1이 커야한다.
1 char str[6] = {'H','e','l','l','o','\0'}; 2 char str[6] ="H…

함수

함수의 구조 1 반환_자료형 함수이름 (매개변수_자료형 매개변수) 2 { 3 ... 4 return 반환값; 5 }

헤더 리턴 값의 자료형, 함수의 이름, 매개변수 목록으로 구성된다. 리턴 값이 없을 때는 void를 사용한다.


몸체 중괄호 안에 명령문들로 구성된다.


매개변수 전달 전달받을 매개변수의 목록을 자료형과 변수명으로 입력하며, 필요한 만큼 쉼표로 연결해서 나열한다.
전달받은 매개변수는 함수 내에서 지역변수로 사용된다.


반환값 return 키워드를 사용해서 값을 반환하고 함수가 종료된다.


함수의 호출 함수의 이름과 매개변수를 사용해서 호출할 수 있으며, 결과 값을 받으려는 경우에는 할당문의 오른쪽에 사용한다.


프로토타입 1 반환_자료형 함수이름 (매개변수_자료형);
함수의 원형은 프로그램의 가장 앞부분 혹은 main() 함수 앞에 모아두어야 한다. 함수의 헤더와 달리 줄 끝에 세미콜론이 있으며, 매개변수의 이름은 생략해도 된다.

분기문

goto 프로그램의 흐름을 특정 문장으로 이동시킨다. goto문과 대응되는 레이블이 존재해야 한다.
1 #include <stdio.h> 2 3 /* 4 분기 5 */ 6 7 intmain() 8 { 9 10 printf("출력됨 1\n");11 goto label1;12 printf("출력안됨\n");13 label1:14 printf("출력됨 2\n");15 16 system("PAUSE");17 return0;18 }

continue 반목문에서 사용되며 흐름을 continue 다음부터 반복문의 마지막 문장까지를 실행하지 않고 다음 반복이 계속된다.
1 #include <stdio.h> 2 3 /* 4 분기 5 */ 6 7 intmain() 8 { 9 int i;10 for(i=0; i<5; i++)11 {12 if(i ==3)continue;13 printf("%d\n", i);14 }15 system("PAUSE");16 return0;17 } 위 예에서는 3이 출력되지 않는다.

break 반복문 안에서 사용되면 해당 루프가 종료된다.
switch 구문에서도 사용된다.

반복문

for 1 for(초기값; 조건; 증감식) 2 { 3 명령문; 4 }

while 1 while(조건) 2 { 3 명령문; 4 }

do - while 1 do 2 { 3 명령문; 4 }while(조건);
최소한 한 번은 실행되어야 하는 경우에 사용된다.


무한루프 1 for(;;) 2 { 3 명령문; 4 }
1 while(1) 2 { 3 명령문; 4 }
1 do 2 { 3 명령문; 4 }while(1);
C 언어에서, 0이 아닌 값은 모두 참이다.


Example : 1 #include <stdio.h> 2 3 /* 4 구구단 5 */ 6 7 intmain() 8 { 9 int i, j;10 for(i=1; i<=9; i++)11 {12 for(j=1; j<=9; j++)13 {14 printf("%d x %d = %2d\n", i, j, i*j);15 }16 printf("\n");17 }18 system("PAUSE");19 return0;20 }
1 #include <stdio.h> 2 3 /* 4 구구단 5 */ 6 7 intmain() 8 { 9 int i, j;10 i =1;11 while(i<=9)12 {13 j =1;14 while(j<=9)15 {16 printf("%d * %d = %2d\n", i, j, i*j);17 j++;18 }19 i

조건문

if 1 if(조건) 명령문;

if - else 1 if(조건) 2 { 3 명령문1; 4 } 5 else 6 { 7 명령문2; 8 }

if - else if 1 if(조건) 2 { 3 명령문1; 4 } 5 else if 6 { 7 명령문2; 8 } 9 else10 {11 명령문3;12 }

switch - case case절에는 break문을 사용해서 다른 절이 실행되지 않도록 해야 한다. case절에서 제시된 조건 중에 하나도 맞지 않는 경우에 default절이 실행된다. 1 switch(조건) 2 { 3 case 값1: 4 명령문1; 5 break; 6 7 case 값2: 8 명령문2; 9 break;10 11 default:12 명령문3;13 }

특수문자와 서식화 문자

ASCII 특수 문자\a경고음 발생\b백스페이스\f폼 피드\n개행\r캐리지 리턴\t수평 탭\v수직 탭\\역 슬래시 (\)\'작은 따옴표 (')\"큰 따옴표 (")
서식 문자%d, %i10진 정수%x, %o16진수, 8진수 정수(양수만)%f, %lf10진수 실수%c하나의 문자%s문자열%u10진 정수 (양수만)%e지수표기법에 의한 실수%E지수표기법에 의한 실수%g소수점 이하 자리수에 따라 %f, %e중 하나를 선택%G소수점 이하 자리수에 따라 %f, %e 중 하나를 선택%%%기호 출력
%03d필드 폭을 3칸 확보하고 남는 자리는 0으로 채움%-3d필드 폭을 3칸 확보하고 왼쪽 정렬%+3d필드 폭을 3칸 확보하고 오른쪽 정렬. 부호 출력.

문자와 문자열

C언어에서는 내부적으로 문자와 숫자가 동일한 것으로 취급된다는 것에 주의해야 한다.
문자 문자는 작은 따옴표 ' '안에 표현하고, 문자열은 큰 따옴표 " "  안에 표현한다.
문자에 실제로 저장되는 값은 아스키 코드 값이다.

1 #include <stdio.h> 2 3 /* 4 문자 5 */ 6 7 intmain() 8 { 9 char ch, cha;10 ch ='a';11 cha =97;12 printf("%c\n", ch);13 printf("%c\n", cha);14 system("PAUSE");15 return0;16 }

문자열 문자열을 위한 별도의 자료형은 존재하지 않으며, 문자형의 배열을 사용해서 문자열을 저장한다.
문자열의 마지막에는 끝을 표시하기 위해 항상 널문자(\0)가 추가된다. 따라서 문자열의 길이는 실제 문자의 갯수에 1을 더한 값이 된다.

1 #include <stdio.h> 2 3 /* 4 문자열 5 */ 6 7 intmain() 8 { 9 char str1[] ="String 1.";10 char* str2 ="String 2.";11 printf("%s\n", str1);12 printf("%s\n", str2);13 printf("%d?\n",sizeof(str1));14 system("PAUSE");15 return0;16 }

연산자

할당 연산자 =

복합 할당 연산자 +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=

산술 연산자 +, -, *, /, %

증감 연산자 ++, --

관계 연산자 ==, !=,
<, <=, >, >=

논리 연산자 !, &&, ||

조건 연산자 ? :

쉼표 연산자 ,

부호 연산자 -

비트 연산자 ~, &, |, ^,
<<, >>

형변환 연산자 (자료형)

sizeof 연산자 sizeof

구조체멤버 ., ->

포인터, 참조 &, *, [ ]

괄호 연산자 ( )

상수

상수는 변수와 유사하지만, 변수와는 달리 항상 일정한 값이 보존되므로, 이 값을 변경할 수 없다.

상수를 정의하는 두가지 방법이 있다.

#define 매크로 상수라고 한다. 1 #define PI 3.141592

const 1 const double pi =3.141592;

변수

변수는 데이터를 임시로 저장하는 메모리 공간이다.

변수명 영문자, 숫자, 밑줄문자로 구성된다.
영문자 또는 밑줄문자로 시작해야 한다.
대소문자가 구분된다.
예약어(키워드)는 사용할 수 없다.

변수의 선언자료형 변수명;
변수의 선언은 소스 코드의 앞부분에 몰아서 해야 한다.

선언과 동시에 초기화할 수도 있다.
1 int i; 2 int j =0;
변수의 초기화 초기화 되지 않은 변수는 0이 아닌 임의의 값을 가지고 있다.


변수의 범위 일반적으로 함수 내에서 선언된 변수는 지역변수이며 함수의 종료와 함께 소멸된다.
1 #include <stdio.h> 2 3 /* 4 지역 변수 5 */ 6 voidfun1() 7 { 8 int x =100; 9 printf("x = %d\n", x);10 }11 12 intmain()13 {14 int x =10;15 printf("x = %d\n", x);16 fun1();17 printf("x = %d\n", x);18 system("PAUSE");19 return0;20 }

자료형

자료형이란 데이터나 자료의 종류와 형태를 말한다. 자료형은 정밀도에 따라, 부호 유무에 따라서 세부적으로 구분된다.

기본형 정수형 int, short, long, unsigned
소숫점 아래에 어떤 값을 갖지 않는 숫자를 정수라고 한다.

실수형 float, double
아주 크거나 아주 작은 값을 표현하기 위해 지수부와 가수부로 나눠서 표시하므로, 소숫점의 위치가 변할 수 있다는 의미로 부동소수라고 한다.
문자형 char, unsigned char

열거형 enum

void형 void

확장형
배열형

함수형

포인터형

구조체형

데이터의 크기 32비트 머신에서 int는 4바이트의 크기를 가진다. 데이터의 크기는 사용중인 컴퓨터와 컴파일러에 따라 다르다.

1 #include <stdio.h> 2 3 /* 4 자료형의 크기 5 */ 6 7 intmain() 8 { 9 10 printf("int : %d\n",sizeof(int));11 printf("short : %d\n",sizeof(short));12 printf("long : %d\n",sizeof(long));13 printf("long long : %d\n",sizeof(long long));14 printf("float : %d\n",sizeof(float));15 printf("double : %d\n",sizeof(double));16 printf("char : %d\n",sizeof(char));17 18 system("PAUSE");19 return0;20 }

키워드

아래의 키워드들은 C 언어의 예약어이므로 변수 이름등 다른 용도로 사용할 수 없습니다.
auto        double        int        long        break        else        long        switch        case        enum        register        typedef        char        extern        return        union        const        float        short        unsigned        continue        for        signed        void        default        goto        sizeof        volatile        do        if        static        while
아래는 C99에서 추가됨
_Bool        inline        _Complex        restrict        _Imaginary

주석문

주석(comment)은 프로그램의 기능이나 동작을 메모해두는 문장이다. 컴파일러는 주석의 내용을 무시한다.

여러 줄 주석 시작 기호(/*)와 끝 기호(*/)는 반드시 쌍으로 사용되어야하며, 중복해서 사용되어서는 안된다.
1 /* 2 주석 3 */
한 줄 주석 원칙적으로, 한 줄 주석문은 C++언어에서 지원되는 형식이다.
1 // 주석

main()

1 /* 2 Hello World 3 */ 4 5 #include <stdio.h> 6 7 intmain(void) 8 { 9 printf("Hello World\n");10 return0;11 }

1~3
주석문은 /*과 */ 사이에 표현되며 프로그램의 기능을 설명하는 내용을 적는다. 프로그램에는 아무런 영향도 미치지 않는다.

5
전처리기(preprocessor)는 #으로 시작되며, 컴파일을 하기 전에 먼저 수행하라는 기호이다.
따라서, 컴파일 하기 전에 stdio.h라는 표준입출력 함수 헤더 파일을 포함시키게 된다. stdio.h에는 printf() 함수에 대한 원형이 선언되어 있다.

7~11
C 프로그램은 반드시 하나 이상의 함수를 포함하게 되며, main() 함수는 반드시 존재해야 한다.

프로그램의 실행은 메인 함수로부터 시작되며, 메인 함수가 끝날 때 프로그램이 종료된다.
함수의 시작과 끝은 중괄호 { }로 묶여지며, 중괄호 안에는 변수 선언문, 치환, 연산, 함수 등의 명령을 기입한다.

9, 10
세미콜론(;)은 한 문장의 끝을 의미한다. 전처리기를 제외한 모든 문장의 끝에는 세미콜론(;)이 사용된다.

10
return은 함수를 종료하고 값을 반환한다. 메인 함수는 운영체제에게 값을 반환한다.