복습을 하기전 이건 알고가자!!(단어들)
소스코드(source code) - 프로그래머가 작성한 프로그램
소스코드를 번역하는것 컴파일(compile)
소스코드를 컴파일한후 나온결과물 기계어
기계어를 라이브러리에 연결하는것 링킹(linking)
기계어를 링킹한 결과물 실행파일또는 exe
링킹중 버그를수정하여 실행 가능 하도록 만드는것 디버깅(Debuging)
입력(매개변수) => 함수 => 출력
토큰(token) - c프로그램을 구성하는 기본단위
분류 - 예약어/ 상수 / 연산자/ 식별자 / 구두점
예약어 - 미리 의미가 정해져있는 단어 ex) int,char,return등
(항상 소문자로 사용) =>C언어는 파이썬과 다르게 대문자와 소문자가 다르게 인식
분류 - 제어문(반복/ 선택 / 점프) / 자료형 / 기억클레스 / 기타등
주석문(comment) - C언어에서 설명문 즉 코멘트를 달기위해 사용
// -> 한줄
/* 구간 */
*함수
ex) printf("%d \n",num);
형지정문자(ex)%d) : 변수의 자료형마다 다르게 사용
확장문자열(escape sequnece)
문자상수 내에서 개행문자, 잔은 따음표,큰 따음표,특별한의미를 갖는 문자등을 나타내기 위해서 사용한다. 두개의 문자로 보이지만 두개의 문자가 하나의 의미를 갖는 단일문자이다.
ex) \n , \r ,\a ,\t,\b,\\
식별자
- 변수나 함수등에 부여하는 이름이다.
- 영문자,숫자,밑줄만 가능하다
- 첫글자는 영문으로 시작해야한다
상수
-정수형(첫글자를 0으로 하면 8진수로 16진수로 표현시 첫글자를 0x로 표현)/실수형(부동소수형)/문자형/문자열(한글은 문자열에들어가면 마직막글자는 \0즉 null값이다)
자료형(data type)
기본 자료형 - 문자형,정수형,부동형,열거형
유도 자료형 - 배열, 함수, 구조체, 공용체, 포인터
void형 - 값이 없음을 표시
const 키워드 : 변수를 상수화할수 있음 => 초기값을 설정시 변경 불가
자동형 변환 : 자료형이 다른 혼합 연산에서 기억장소가 큰쪽으로 통일
char -> unsigned char -> int ->unsigned int -> long -> unsigned long ->float -> double
표준 입출력 함수
양식 -> printf("%[정렬][폭][.정밀도][크기]형지정문자",.....);
형지정문자
d 10진 정수형
x 16진 정수형
c 문자
s 문자열
u 부호가 없는 10진 정수
f 실수형
p 포인터의 번지값
정렬
- 왼쪽 정렬
default , + 오른쪽 정렬
# 형지정문자에따라 특별한 형태로 변형
폭
default 출력하는 데이터에 따라 폭이 맞추어짐
수 그수만큼 폭이 커짐
0수 남은 폭이 0으로 채워짐
* 수와 비슷 대신 매개변수로 수를 넣어야함
정밀도 : 수를 얼마나 정밀하게 출력할건지 결정
크기 데이터의 정확한 크기 조절
표준 입출력 함수 scanf => scan formated
키보드로 부터 데이터를 입력을받아 메모리에 저장
양식 - scanf("%[*][폭][크기]형지정문자",.....);
형지정문자 출력과동일
* 그수를 그만큼 무시한다
크기 그크기만큼의 값을 받아들일수있다
전처리기(proprocessor)
컴파일되기전에 일련의 작업을 수행하는것
main() 외부에 작성
모든 전처리기는 #이라는 기호 즉 구두점을 명령어 앞에 붙이고 ;을 붙이지 않는다
#define문 - 메크로(macro)상수와메크로 함수를 만들때 사용
-메크로상수 / 프로그램 전체에서 하나의 기호 상수나 자료형으로 대치시키도록 전처리기에 알려주고, 호출시 정의된 기호상수난 자료형으로 대치
양식 - # define 메크로상수_또는_문자열 ex) #define SIZE 30//메크로상수_또는_문자열은 대문자로,컴파일전 SIZE라는 문자열을 30으로 바꿔주고 이러한과정의 매크로 전개라고 한다. 이러면 소스에서 SIZE는 존재하지 않게 된다
-메크로 함수
양식 - #define 메크로명(매개변수,..)(치환리스트)
치환리스트이 매개변수들은 부작용방지를 위해 일일이 괄호로 묶어준다
ex ) #define SQUARE(a)((a)*(a))
장점 - 자료형과 관계없이 하나의 메크로 함수 구현가능, 시간상 지체가 거의없다(단순한 치환이기 때문)
단점 - 치환리스트의 매개변수들은 부작용 방지를 위해 일일이 괄호로 묶어주는것이 귀찮다
#include문 - 파일을 프로그램에 추가하고 싶을때 사용하는 전처리기이다.헤더파일을 프로그램에 추가하고자할때 많이사용
양식 - #include <파일명> ex) #include <stdio.h>// 표준해더파일을 사용할경우
양식 - #include "파일명' ex) #include "C : \ header_file\test.h" 표준해더파일을 사용하지않을경우 정확한 위치를 알려줘야함.정확하게하지 않을경우 현재작업디렉토리나 표준해더 디렉토리에서 찾게된다.
*프로토타입 -> 함수의사용법.대부분 해더파일안에 있음
ex) int printf(~;//printf의 함수,프로토타입
조건부컴파일
#if~#endif => 대부분 다국어버전의 프로그램을 만들때 사용
양식
#if 조건1 문장1
#elif 조건2 문장2
#else 문장3
#endif
#ifdef~#endif => 매크로명이 있을경우 실행
양식
#ifdef 매크로명
문장
#endif
#ifndef~#endif => 매크로명이 없을경우 실행 , 해더파일이 2중으로 정의되경우의 예방
양식
#ifdef 매크로명
문장
#endif
#undef => #define문에의해 정의된 메크로를 취소하기위하여 사용 다시 재정의하기 위하여 주로사용
#error => 컴파일중 에러가 발생하면 작업을 중단하면서 행번호와 메시지를 출력
연산자(operator) /변수또는 상수에 대하여 무었인가를 행하도록하는 단어나 기호를 말함,연산자에는 우선순위가 있다
피연산자(operand)/연산자가 연산을하는 대상
산술연산자/대입연산자/혼합대입연산자/관계연산자/논리연산자/비트연산자/시프트연산자(<<)/조건연산자(a?b:c)/증가,감소연산(++,--)자/ cast연산자((자료형)변수)/컴마연산자/size of 연산자/포인터 조작연산자(&,*)
제어문
조건문 => if/switch case
반복문 => for(제어 변수초기식(0);조건식(1);증감식(3)){(2)}/ while/do while
분기문 => break/continue/ goto
함수 - 특정한 작을 하도록 만들어진 독립적인 단위모듈 표준 라이브러리함수
표준라이브러리함수 - 컴파일러에 지원해주는함수
선언 / 호출 / 정의
재귀함수(recursive) - 함수가 함수내에서 자기자신을 호출할수 있는데 이를 재귀호출이라함. 호출을 허용하면 재귀함수라고 한다. 구현 하고자하는 작업을 반복하려고 할때 유용.
단점 : 함수의 반복적 호출로 인한 시간과 메모리공간의 효율성이 떨어질수있다
ex) int sum(int n){
if(n<=1)return(1);
else return(n+sum(n-1));
}
매개변수 전달 방법
call by value vs call by reference
값을 형식 매개변수로 전달 vs 실매개변수의 주고를 형식 매개변수로 전다
ex of call by reference ) int sum(int *a,int *b){*a+=2;*b+=2; return(*a+*b);}
구조적 프로그래밍 => 큰프로그램 하나를 여러개 모듈로 분할하여구현
ex ) 계산기 프로그램 -> 입력기능/덧셈기능/뺄샘기능 등
기억 클래스
지역변수 : 해당함수나 블록내에서만 사용할수있다
전역변수 : 소스전채에서 사용가능
default & auto변수 : 해당함수나 블록내에서만 유효한 지역변수이다. 기억영역의 생성고거가 명확 리턴된값은 스택에 복사되어 외부로 전달
레지스터(register) 변수 : 데이터를 임시로 저장하는데 사용,작고 빠른 기억장소,2개 까지만 선언가능 초과될시 auto로 저장,c++부터는 컴파일러가 지정하기 때문에 따로 지정할 필요가 없다.
정적(static) 변수 : 프로그램이 종료될때까지 값을 유지,처음실행시 한번만 초기화되고 초기화 값이 없으면 0으로 초기화, 스택이 아닌 정적데이터 영역을 사용한다
extern 변수 : 함수외부에서 선언되는변수이며 프로그램 모든부분에서 사용할수있다.(전역변수),해당파일에 실제있는 변수가 아니라 다른 파일에 선언된 변수(해당파일에서 사용가능하게한다)
배열 : 연속적인 항목들이 동일한 크기의 순서를 갖고 나열되어있는 데이터의 집합
일차원 배열 / 다차원 배열
선택정렬 알고리즘(c코드)
for(i=0;i<2;i++){
for(j=i+1;j<3;j++){
if(num[i]<num[j]){
temp=num[i];
num[i]=num[j];
num[j]=temp;
}}}
포인터와 문자열
*포인터(=포인터 변수)
메모리의 주소를 이용하여 메모리의 내용을 직접접근할수있다.메모리의 주소를 알고 싶다면 &연산자를사용하여 &변수라고하면 변수가 기억되어 있는 메모리 번지를 알수있다. 메모리의 주소를 저장하려면 일반변수가아니라 포인터를 사용해야한다.
ex) int x; //일반변수 x의 선언
//int *x; //포인터변수 x의 선언
int* px; //포인터변수 px의 선언
px=&x;
int y;
y=*px;
/*
x=10 , &x=x의 주소
px=x의주소 , &px=px의 주소 , *px=10
y=10 , &y=y의 주소
*/
널포인터
초기화된 주소가 널(NULL)인 경우 널포인터라 하면 0번지를 가리키고 있다. ex)int *px=NULL;
보이드형 포인터
가리키고 있는 대상체가 정해져있징낳아 어떤것이든 가리킬수있다 ex) 파일
포인터와 배열
배열의 이름은 그배열의 시작주소를 저장하는 포인터다.첨자의 이름없이 배열의 이름만을 사용할수있다
ex) int s[5];
/*
s==s[0] , s+1==s[1] , s+i==s[i] , *(s+i)==*&s[i]==s[i]
*/
포인터와 문자형
char *ch="ABC";// char ch[]="ABC";
ch= ch의 주소 ch[0]=A *ch=A
ch+1= ch의 주소+1 ch[1]=B *(ch+1)=B
call by reference => 리턴되지 않을경우 변경값이 저장되지않기 때문에 call by reference로 포인터를 사용하여 변경값을 유지할수있다.
ex) swap(&a,&b);
void swap(int *ap,int *bp){
int temp;
temp=*ap;
*ap=*bp;
*bp=temp;
}
동적메모리 할당(dynamic memory)
동적메모리는 실행시간에 할당되어 사용되는 메모리 블록으로 힙(heap)에 할당한다
maloc()같으 함수를 통해서 원하는 크기로 할당
동적으로 확보된 기억공간은 이름이 없기 때문에 주소를 이용한다.즉 포인터를 이용해야한다.
동적으로 할당된메모리는 해재하지 않을 경우 메모리 누수가 발생하여 다른 프로그램에서 해당 공간을 사용할수없다.
가비지(garbage)는 메모리공간내에서 더이상 피요치 않다고 판단되어 OS에 의해 회수되 저장공간을 말함. 이러한 가비지를 효율적으로 재사용할수 있도록 풀어주는것을 가비지 컬랙션이라고 한다.(JAVA&C#)
ex)
# define SIZE 4;
int *num;
num=(int*)malloc(SIZE*sizeof(int));//num[4], 확보가 안되면 null
for(n=0;n<SIZE;n++){
printf("%d\n",num[n]);
}
free(num);//가비지 컬랙션
함수포인터 - 함수를 가리키는 포인터(function pointer)
사용할 함수가 DLL파일에 있는 경우에는 반드시 함수포인터를 사용해야 함수를 사용할수있다.
ex) void print(){printf("프린트 함수 사용");}
void (*view)(void);
view=print;
view();
함수포인터 배열
int sum(int a,int b){rerurn (a+b);}
int sub(int a,int b){rerurn (a-b);}
int mul(int a,int b){rerurn (a*b);}
int (*q[3](int,int))={num,sub,mul};
int result;
for(i=0;i<3;i++){
result=q[i](20,10);
printf("%d\t",result);
}
구조체(structure) - 그루핑하면 프로그래밍하기 편리한 자료들을 하나로 묶는것을 말한다
선언시
struct 구조체이름{
자료형 멤버명;
자료형 멤버명;
...
}(구조체형 변수);
구조체 멤버의 참조와 연산
struct Man minsu;
struct Man *minjung;
minsu.age=19;
minjung->age=21;
=> 레코드란 데이터를 저장하고 있는 파일이나 데이터베이스 등에서 서로관련된 일련의 데이터들을 하나로 묶어 놓은것 ,레코드를 구성한는 각각의 항목 필드(field)
레코드:필드=구조체명:구조체멤버
새로운 자료형을 통한 구조체 정의
struct Point{
int x,y;
}
typedef struct Point point;//typedef(type definition)
point space1;
중첩된 구조체
typedef struct Birth{
int y,m,d;
}birth;
typedef struct Person{
char name[10];
birth day;
}person;
person man={"김성환",{1999,12,29}};
구조체 배열과 포인터
person man[3];
person *boy;
boy=&man[0];//boy=&man;
구조체를 함수의 매개변수로 전달
typedef struct point{
int x;
int y;
}Point;
Point addPoint(Point p1,Point p2){
Point temp;
temp.x=p1.x+p2.x;
temp.y=p1.y+p2.y;
return temp;
}
구조체 call by reference
void Swap(Point *p1,Point *p2){
Point temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
// 응용
for(i=0;i<2;i++){
for(j=i+1;j<3;j++){
if(A[i]>A[j])swap(&A[i],&A[j]);
}
}
시작 2019.11.06
중간수정 2019.11.07,08,12
최종수정 2019.11.13
'잡다한지식 > 복학전 대학 공부' 카테고리의 다른 글
입대전 대학공부하며 만든 블로그 (0) | 2021.08.31 |
---|---|
전역후 자바 공부시작 (0) | 2021.03.29 |