1. 가변 인자 함수

- 함수에 들어가는 인자의 개수가 변하는 것

- 함수를 호출 할때 인수의 개수나 타입의 변경을 할 수 있다.


2. 자료형 함수이름 (자료형, 고정매개변수, ...)

- 가변 인자를 정의할 때는 고정 매개변수가 한 개 이상 필요

- "..." 생략 표시를 통하여 가변인자 표시


bool WriteLog(LPTSTR data, ...)

{


}



3. va_list, va_start(), va_arg(), va_end()


va_list 

- char* 로 정의 되어 있으며 이 포인터가 각 인자의 시작주소를 가르킨다.


va_start() 

- va_list로 만들어진 포인터에게 가변인자의 첫 번째 주소를 가르켜주는 매크로

- va_start(ap, v);  ap : va_list로 만든 포인터, v : 마지막 고정인수 


va_arg()

- va_list의 포인터를 다음가변인자로 이동시켜주는 매크로

- va_arg(ap, t);  ap : va_list로 만든 포인터, t : 타입 형태 (char, int, long ...)


va_end() 

- 가변인자를 NULL 포인터로 만드는 매크로, 가변인자 종료역할 

- va_end(ap);  ap : va_list로 만든 포인터


4. 가변인자함수 출력 함수 vsprintf()

vsprintf() : Dest 변수에 형식에 따라 만들어진 문자열 저장 

int vsprintf (char* Dest, const char* Format, va_list Args)

- Dest : Format에 따라 만들어진 내용이 담길 버퍼

- Format : 고정인수

- Args :  va_list로 만든 포인터, 가변 파라미터

- 리턴 값 : 문자열의 길이


5. 예제


#include <stdio.h>

#include <stdarg.h>

#include <string.h>


void VariableFun(int arg, ...)

{



//가변인자 목록 포인터

va_list ap;

//가변인자 목록 포인터에 가변인자 첫 번째 주소 가르킴

va_start(ap, arg);

//가변인자 만큼 반복

for (int i = 0; i < arg; i++)

{

//int 크기만큼 포인터를 이동

int result = va_arg(ap, int);

printf("%d ", result);

}

//가변인자 목록 포인터에 NULL 초기화

va_end(ap);


printf("\n");

}



int main()

{

VariableFun(1, 2);

VariableFun(2, 2, 0);

VariableFun(3, 2, 0, 8);

VariableFun(4, 2, 0, 8, 0);

VariableFun(5, 2, 0, 8, 0, 2);

}


결과











'프로그래밍 공부 > 궁금한 정보들' 카테고리의 다른 글

C++ 구조체와 클래스 차이  (0) 2022.02.04
문자열 _T 매크로, C++ 리터럴이란  (0) 2018.01.04
동적 메모리 할당  (0) 2016.02.18
포인터 (pointer)  (0) 2015.07.25
배열(array)  (0) 2015.07.25

동적 메모리 할당


malloc 함수

- 동적으로 메모리를 할당하는 함수 (힙 영역에 메모리를 할당)

#include <stdlib.h>

void* malloc(size_t size) //malloc 함수의 원형

- 할당한 메모리의 주소(첫 번째 바이트의 주소)를 리턴, 실패시 NULL 리턴

void* 인 이유

- malloc은 메모리 할당 함수이기 때문에 

  개발자가 어떠한 데이터 형(float, int, double 등)을 저장할지 예측 불가

  따라사 알맞은 용도로 변환하여 사용 할 수 있도록 void 사용

ex)

int *i = (int *) malloc (sizeof(int));

- malloc(sizeof(int)) == 힙 영역에 4바이트 할당 받는다.

- (int *) == void * 가 int * 형으로 변환

- int * 가 *i 에 대입 


free 함수

- 힙 영역에 할당된 메모리를 해제하는 함수

#include<stdlib.h>

void* free(void* ptr) //free 함수의 원형


calloc 함수

#include<stdlib.h>

void* calloc(size_t  elt_count, size_t  elt_size) //calloc 함수 원형

- calloc 함수는 elt_size 크기의 변수를 elt_count개 만큼 저장 할 수 있는 메모리 공간을 할당 하라는 의미를 갖는다.


malloc 함수와 calloc함수의 차이점

malloc은 할당된 공간의 값을 바꾸지 않는다.

calloc은 할당된 공간의 값을 모두 0으로 초기화 한다.


realloc함수

-이미 할당한 공간의 크기를 바꿀 때 realloc 함수를 사용한다.

#include<stdlib.h>

void* realloc(void* memblock, size_t size); //realloc 함수의 원형

-realloc은 이미 할당한 포인터 변수를 memblock에 넣고 바꾸고 싶은 공간의 크기를 size에 입력하여 사용한다.


'프로그래밍 공부 > 궁금한 정보들' 카테고리의 다른 글

문자열 _T 매크로, C++ 리터럴이란  (0) 2018.01.04
가변인자 함수  (0) 2018.01.03
포인터 (pointer)  (0) 2015.07.25
배열(array)  (0) 2015.07.25
메모리구조(스택, 힙 , 데이터 영역)  (0) 2015.07.21

포인터(pointer) *

-메모리 주소를 가지고 있는 변수


주소 연산자(address-of operator)  &

-변수의 주소를 계산하는 연산자


포인터 선언

int       *p; //정수를 가르키는 포인터

char   *pc; // 문자를 가르키는 포인터

float    *pf; // 실수(float형)를 가르키는 포인터

double *pd; // 실수(double형)를 가르키는 포인터


포인터와 변수의 연결

int  i = 10;  // 정수형 변수 i 선언

int *p = &i; // 변수 i의 주소가 포인터 p로 대입


간접 참조 연산자 *

int i =10;          //정수형 변수 i 선언

int *p=&i;        //변수 i의 주소가 포인터 p로 대입

printf("%d", *p); //*p는 p가 가르키는 위치에 있는 데이터를 가져오라는 의미


주의

포인터의 타입과 변수의 타입은 일치하여야한다.

초기화하지 않고 사용하기 (NULL 포인터 사용)

'프로그래밍 공부 > 궁금한 정보들' 카테고리의 다른 글

가변인자 함수  (0) 2018.01.03
동적 메모리 할당  (0) 2016.02.18
배열(array)  (0) 2015.07.25
메모리구조(스택, 힙 , 데이터 영역)  (0) 2015.07.21
함수  (0) 2015.07.16

배열(array)

목적 : 많은 값을 한꺼번에 저장 할 수 있는 저장소가 필요

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

- 대용량의 자료를 저장하는 기복적인 구조

- 대량의 데이터를 효율적이고 간편하게 처리

arr [index]  = 100 ;


첨자(subscript), 인덱스(index)

- 배열의 원소 번호


배열의 원소, 요소(array element)

- 배열에 저장된 데이터들


선언 방법

자료형 배열이름[배열 크기];

 int      arr     [    10    ];

사용

arr[i] = 100;         // i 는 정수 변수

arr[i+2] = 100;       // 수식이 인덱스

arr[index[3]] = 100; // index[]는 정수 배열


초기화

arr[5] = {10,20,30,40,50};

arr[5] = {10,20,30};     //앞에 있는 원소들만 초기화 나머지 0으로 초기화

arr[ ] = {10,20,30,40,50};//컴파일러가 자동으로 초기 값들의 개수만큼 배열의 크기를 잡는다.

배열과 함수

int get_averrage(int score[], int n); //  배열, 베열의 크기를 받는 매개변수


'프로그래밍 공부 > 궁금한 정보들' 카테고리의 다른 글

동적 메모리 할당  (0) 2016.02.18
포인터 (pointer)  (0) 2015.07.25
메모리구조(스택, 힙 , 데이터 영역)  (0) 2015.07.21
함수  (0) 2015.07.16
전처리 지시어(Preprocessing directive)  (0) 2015.07.14

메모리구조

- 프로그램 실행 하면-> 운영체제 -> 메인 메모리(RAM) -> 메모리 공간 할당


- 메모리 공간(code,stack, heap, data)


code 영역

-실행할 프로그램 코드가 저장되는 메모리 공간

-프로그램 명령이 위치하는 곳


Data 영역

-전역 변수와 static 변수가 할당되는 영역

-프로그램 시작할 때 할당, 프로그램 종료할 때 메모리에서 소멸


Stack 영역

-지역 변수와 매개 변수가 저장되는 영역

-함수가 호출될 때 할당, 함수가 종료되면 소멸


Heap 영역(메모리 동적할당 시 사용하는 영역)

-필요에 의해 동적으로 메모리를 할당

-프로그래머가 할당, 소멸 가능한 영역

-할당해야 할 메모리의 크기를 프로그램이 실행되는 동안 결정 해야하는 경우

'프로그래밍 공부 > 궁금한 정보들' 카테고리의 다른 글

포인터 (pointer)  (0) 2015.07.25
배열(array)  (0) 2015.07.25
함수  (0) 2015.07.16
전처리 지시어(Preprocessing directive)  (0) 2015.07.14
전처리 지시어, 함수, 변수, 상수, 자료형 정의  (0) 2015.07.14

함수 형태

[반환형태][함수이름][입력형태]

{

    [함수의 몸체]

}

-반환 값 [x] 전달인자 [x]

void one (void)

{

printf("반환 값과 전달 인자가 없습니다.");

}

-반환 값 [x] 전달인자 [0]

void two(int num)

{

printf("반환값은 없고 전달인자는 %d 입니다.",num);

}    

-반환 값 [0] 전달인자[x]

int three()

{

return 4;

}

-반환 값 [0] 전달인자[0]

int four(int num)

{

printf("전달인자는 %d 이고",num);

return num+4;

}


전처리(preporcessing)

-컴파일 이전에 미리 처리되는 문장

전처리 지시어(preprocessing directive)

-전처리에 사용되는 작업지시어

전처리기(preprocessor)

-전처리를 처리하는 처리기

-전처리기 지시어 -> 컴파일러가 전처리기 내용 인식 -> 지시된 사항을 참고하여 컴파일 수행

-컴파일러에게 특별한 작업을 부여하기 위한 지시어


<전처리 지시어의 종류>

<파일 처리> - #include

<형태 정의> - #define, #undef

<조건 처리> - #if, #else, #elif, #endif, #ifdef, #ifndef

<에러 처리> - #error 

<디버깅>    - #line 

<컴파일 옵션 처리>- #pragma 


<파일 처리>

#include

-헤더 파일을 지시어가 들어가 있는 위치에 헤더파일을 포함시키는것

<사용법>

-#include<filename> == 표준 라이브러리 헤더파일, 제공되는 것

-#include "filename" == 사용자 정의 헤더 파일, 직접 만든 것

<형태 정의>

#define

-상수값을 지정하기 위한 예약어, 매크로

-구문의 상수로 치환

<사용법>

-#define [매크로명] [실제값]

-ex) #define MAX 100  == MAX라는 문자이 나올 때마다 100으로 치환해서 컴파일

<장점>

-가독성 증가 == student(10) <-> student(MAX)

-유지보수의 편리성 증가 

-간단한 매크로 함수를 정의 사용 가능 == #define SQUARE(X) ((X) *(X)) 

#undef

-#define으로 정의된 매크로를 무효화

<사용법>

#define MAX 100

#undef MAX //MAX를 해제


<조건 처리> - #if, #else, #elif, #endif, #ifdef, #ifndef

#if    -> 조건이 맞으면 컴파일 맞지않으면 넘어간다                |  ...이 참이라면

#elif -> #if #ifdef #ifndef의 조건에 맞지 않을 경우 다른 조건을 검색 |  #if가 참이 아니라면

#else  -> #if #ifdef #ifndef의 조건에 맞지 않으면 컴파일            |  #if,#elif 가 참이 아니라면

#ifdef  -> 문자열이 define 되어 있으면 컴파일                    |  ...이 정의 되어 있다면

#ifndef -> 문자열이 define 되어 있지않으면 컴파일                 | ...이 정의 되어 있지않다면

#endi f -> #조건부 컴파일 지시어를 마치게 해주는 지시어         | 마지막에 무조건 써야된다

#if defined->defined 뒤에 식별자가 정의되어있으면 1 아니면 0     | define 정의 유무 확인

 * #ifdef 와 #if defined 의 차이

 ->#if defined는 여러 개가 정의되어 있는지를 확인해볼 수 있다       | #if defined A||defined B

<에러 처리>

#error

-소스 라인에 직접 에러 메세지를 출력한다

<디버깅>

#line

-소스 코드의 행번호를 지정하기 위한 것

<컴파일 옵션 처리>

#pragma 

-컴파일러 작성자에 의해서 정의된 다양한 명열을 컴파일러에게 제공하기위해 사용되는 지시어




#include<stdio.h> == 전처리기 지시어

->헤더 파일 stdio.h를 소스 코드 안에 포함 시키라는 의미의 문장

헤더 파일 (header file)

-> 코드의 일부분이 들어 있는 텍스트 파일 '.h'의 확장자를 가진다

stdio.h == standard input output (표준 입출력)

->표준 입출력 관한 라이브러리 함수들의 정의가 들어있다.

표준 입력 -> 키보드로부터의 입력

표준 출력 -> 화면으로의 출력


함수

라이브러리 함수 -> 외부에서 가져와서 사용하는 함수

사용자 정의 함수 -> 사용자가 직접 작성하는 함수


변수, 상수

변수(variable)

-> 데이터 값들이 일시적으로 저장되는 공간

-> 메인 메모리에 만들어 진다.

상수(constant)

-> 값이 한번 정해지면 값을 변경할 필요가 없는 데이터


자료형

-> 데이터 종류

-> 정수형,문자형,부동 소수점형(실수)

지역 변수(Local variable)

-선언된 함수내에서만 존재하고 접근이 가능한 변수

-함수호출시 생성 리턴시 소멸

-선언된 지역이 다르면 같은 변수명 사용 가능

-디버깅 효율을 향상시킨다

-메모리를 절약한다

-재귀 호출, 상호 호출같은 특별한 기법 사용 가능


전역 변수(Global variable)

-어디서든 접근 가능한 변수

-함수 내에 선언되지 않는다

-프로그램 시작과 동시에 메모리에 할당 프로그램 종료시 소멸

-초기화 하지 않으면 0으로 자동 초기화

-전역 변수의 수가 증가하면 프로그램의 구조 복잡해진다

-지역변수와 전역변수의 이름이 같다면 지역변수 사용

-프로그램 모든 영역에서 접근 가능

-------------------------------------------------------------

요약

지역 변수(Local variable)

정의 : 선언된 함수내에서만 존재하고 접근이 가능한 변수

장점 : 디버깅 효율 향상, 메모리를 절약, 함수의 독립성

단점 : 다른 함수에서 특정함수의 변수로 접근 할 때 까다롭다


전역 변수(Global variable)

정의 : 어디서든 접근이 가능한 변수

장점 : 프로그램의 모든 영역에서 접근 가능

단점 : 메모리 낭비, 함수의 독립성 저하, 프로그램의 구조가 복잡해진다


Call By Value

-인자로 넘기는 값을 복사해서 새로운 함수에 넘겨주는 방식

- 값에 의한 호출

-값의 복사에 의한 함수 호출

-값을 복사해서 전달하기 때문에 원본의 값이 변경될 가능성이 없다

-값을 넘겨 줄 때마다 고비용, 복사손실 문제가 발생한다


Call By Reference

-참조에 의한 호출

-주소 값을 인자로 전달하는 함수 호출

-원본의 값의 변경이 일어 날 수 있다.

----------------------------------------------------------------------------------------

요약

Call By Value 

정의 : 값에 의한 호출

장점 : 원본의 값이 변경될 가능성이 없다

단점 : 고비용, 복사손실 문제 발생


Call By Reference

정의 : 참조에 의한 호출

장점 : 호출시간 단축

단점 : 원본의 값이 변결될 가능성이 있다.

----------------------------------------------------------------------------------------

Call by Value

-인자로 넘기는 값을 복사해서 사용하기 때문에 swap함수 내부에서만 값이 바뀌고

-main에서는 값의 변화가 없다

Call by Reference

-인수로 넘겨주는 쪽의 메모리 상의 주소가 전달 되기 때문에 swap 함수 내부에서의 값 변화는

-main에서도 값이 변화한다




+ Recent posts