C언어 정리

함수 특정한 작업을 수행하는 독립적인 부분

 

  • 함수 사용시 코드 중복을 막을 수 있다.
  • 재사용성이 있다.
  • 모듈로 나누어 개발 과정이 쉬워진다.

 

함수의 종류

 

  • 사용자 정의 함수
  • 라이브러리 함수 컴파일러 제공 라이브러리

 

함수 구현

반환형 함수이름(매개변수 1, ... , 매개변수 n) <- 함수 헤더

함수시작{

함수 몸체

함수 종료}

함수 호출 함수를 호출하여 사용하는 것


함수 원형 컴파일러에게 함수에 대하여 미리 알리는 것(함수 호출 부분 위에 있으면 안써도 되지만 그런 경우가 적음)

가변 매개 변수 매개 변수의 개수가 가변적으로 변할 수 있는 기능

ex) int sum(int sum, ...)

순환 (재귀 호출) : 알고리즘이나 함수가 수행 도중에 자기 자신을 다시 호출하여 문제를 해결하는 기법자기자신을 재호출하는 것으로 순환을 멈추는 부분이 있어야 함

 

함수와 변수

변수의 속성 이름,타입,크기,+범위,생존시간,연결

범위 변수가 사용 가능한 범위가시성

생존 시간:메모리에 존재하는 시간

연결 다른 영역에 있는 변수와의 연결 상태


변수의 범위

전역 변수 함수의 외부에서 정의프로그램이 끝나면 소멸초기화 안해도 0. 모든 함수에서 사용하는 공통적인 데이터를 전역변수로 선언우선순위 지역변수 전역변수

지역 변수 함수의 내부블록 안에서 정의선언된 블록이 끝나면 소멸

 

생존 기간

자동 할당 블록에 들어갈 때 생성블록에서 나올 소멸

정적 할당 프로그램 실행 시간 동안 계속 유지변수가 선언된 위치저장 유형 지정자로 생존기간 결정

auto : 자동할당과 동일

static : 정적변수로 블록이 끝나도 유지됨

register : CPU안의 레지스터에 변수가 저장됨

extern : 외부 연결시 사용

연결 다른 범위에 속하는 변수들을 서로 연결하는 것

외부 연결 전역변수에 extern을 붙여 다른 파일에서도 접근 가능하게 함

내부 연결 함수앞에 static 붙여 외부에서 접근 못하게 함

무연결

 

배열

배열 동일한 타입의 데이터가 여러 개 저장되어 있는 데이터 저장 장소

배열은 변수에 인덱스를 통해 접근함반복문과 활용하면 간편하게 처리됨원소 일일이 복사,비교 해야됨

ex)int grade[10]; -> 정수형 원소 10개를 저장하는 grade 배열 생성(인덱스는 0부터)

초기화 : int grade[5]={10,20,30}; -> [0]:10 [1]:20 [2]:30 [3],[4]:0 저장됨배열크기 지정안하면 초기화된 개수만큼만 배열 생성

배열 원소 개수 구하기 : sizeof(배열이름) / sizeof(배열이름[0])

 

포인터

포인터 

 

  • 변수의 주소를 가지고 있는 변수
  • 변수의 크기에 따라서 차지하는 메모리 공간이 달라진다
  • 명시적으로 포인터의 타입을 변경할 수 있음

 

포인터 변수 선언 : *변수 ex) int *p;

변수의 주소를 계산하는 연산자 : & ex) 변수 i의 주소 : &i

포인터와 변수의 연결 : p = &i;

간접 참조 연산자 *: 포인터가 가리키는 값을 가져오는 연산자 ex) *p -> p가 가리키는 변수의 값 반환


포인터 연산

증가 연산 포인터변수에 +1을 할 경우 타입에 따라 주소 늘어나는 양이 다름

ex) char 타입 +1-> 1byte 증가, int타입 +1 -> 4byte증가

*p++ : p가 가리키는 위치에서 값을 가져온 후에 p를 증가

(*p)++ : p가 가리키는 위치의 값을 가져온 후 처리가 끝나면 값을 증가

*++p : p를 증가시킨 후에 p가 가리키는 값을 가져옴

++*p : p가 가리키는 위치에서 값을 가져온 후 처리 전에 그 값을 증가


포인터와 배열

포인터는 배열처럼 사용이 가능(인덱스 표기법을 포인터로도 가능)

ex) int a[] = {10,20,30,40,50}; *a->10 *(a+1) -> 20 a->a[0]의 주소 (a+1)->a[1]의 주소

int *p=a; p[0]=10;

 

함수 호출시 인수 전달 방법

값에 의한 호출(call by value) : 변수를 매개변수로 사용할 때 값을 복사해서 넘겨줌

참조에 의한 호출(call by reference) : 해당 변수의 주소값을 넘겨줌(scanf도 주소값을 넘김). 배열 매개 변수는 인덱스 없이 적으면 됨


포인터 사용 주의점

 

  • 초기화가 안된 포인터를 사용하면 안됨 ex) int *p; *p=100;
  • 포인터가 아무것도 가리키고 있지 않는 경우에는 NULL로 초기화
  • NULL 포인터를 가지고 간접 참조할 경우 하드웨어로 감지 가능
  • 포인터의 유효성 여부 판단이 쉬움
  • 포인터의 타입과 변수의 타입 일치해야함
  • 함수가 종료되더라도 남아있는 변수의 주소를 반환해야함 (함수 내에 있는 지역 변수의 주소를 반환하면 함수종료시 사라져서 오류가 뜸)

 

포인터 사용의 장점

 

  • 연결 리스트나 이진 트리 등의 향상된 자료 구조를 만들 수 있음
  • 참조에 의한 호출이 가능함
  • 동적 메모리 할당

 

 

이중 포인터

이중 포인터 포인터를 가리키는 포인터

**p -> *p : p가 가리키는 위치의 내용 **p : *p가 가리키는 위치의 내용

포인터 배열 포인터를 모아서 배열로 만든 것

int *ap[10]; -> [] 연산자가 *연산자보다 우선 순위가 높아 ap는 배열이 됨 -> int *(포인터)들의 배열로 선언

ex) int *ap[10]={&a,&b,&c,&d,&e};

 2차원 배열로 문자열 저장

 문자형 포인터 배열

 char fruits[4][10]={“apple”,“blueberry”};

char *fruits[]={“apple”,“blueberry”}; 

2차원 배열 사용시 낭비되는 공간 발생 

그런거 없다 

 

배열 포인터 배열을 가리키는 포인터

int (*pa)[10]; -> 먼저 포인터가 됨 -> int [10]을 가리키는 포인터가 됨

ex) int a[5]={1,2,3,4,5}; int (*pa)[5]; pa=a; (*pa)[0] (*pa)[1] (*pa)[2] 로 사용

2차원 배열과 포인터 연산

2차원 배열로 생성해도 1->2->3행 순으로 메모리에 저장 포인터를 이용하여 2차원 배열을 탐색 가능


함수 포인터

함수 포인터 함수를 가리키는 포인터함수도 메모리에 존재하기 때문에 함수 주소를 가져올 수 있다.

int (*pf)(int,int); -> pf가 먼저 포인터가됨 -> int 함수(int,int) 함수를 가리키는 포인터가 됨

함수 포인터 배열 같은 반환타입매개변수를 사용하는 함수를 여러개 저장하는 배열

int (*pf[5])(int,int);

const 포인터

const를 붙이는 위치에 따라서 의미가 달라짐

const char *p : p가 가리키는 내용이 변경되지 않음을 나타냄

char *const p : 포인터 p가 변경되지 않음을 나타냄

 

구조체

구조체 다른 타입의 집합

구조체 선언 형식

struct 구조체이름{

자료형 멤버1;

자료형 멤버2;

...

};

구조체를 선언할 때 구조체포인터를 멤버로 가질 수 있다.


구조체 변수 선언

변수 : struct 구조체이름 변수명;

배열 : struct 구조체이름 변수[크기];

선언과 동시에 초기화 가능

struct student s1 = {24, “Kim”, 4.3};

struct student s2[3]={{1,“Park”,172.8},{2,“Kim”,179.2},{3,“Lee”,180.3}};

구조체 멤버를 참조하려면 .연산자를 사용함

ex) s1.number = 26; s1.grade=4.3;

같은 구조체 변수끼리 대입은 가능하나 비교가 불가능


구조체와 포인터

struct 구조체이름 *p; p=&s1;

포인터를 사용시 ‘.’연산자, ‘->’연산자 사용 가능

ex)동일한 기능 (*p).number (*p).name, p->number p->name

 

구조체와 함수

구조체를 함수의 인수로 전달할 경우 구조체의 복사본이 함수로 전달되어 메모리 소비가 커짐

구조체의 포인터를 함수의 인수로 전달할 경우 원본이 훼손될 수있으나 시공간 절약가능

int equal(struct 구조체이름 const *p1) : const를 추가함으로써 포인터를 통한 구조체의 변경을 막는 것

함수에서 구조체 반환시 구조체의 복사본을 반환

공용체 같은 메모리 영역을 여러 개의 변수가 공유공용체를 선언하고 사용하는 방법은 구조체와 비슷

공용체 선언 형식

union 공용체 명{

char c;

int i; //i와 c는 같은 공간을 활용

};


+ Recent posts