(1) call-by-value
  call-by-value는 단순히 실 매개변수 값을 형식 매개변수에 복사함으로 구현한다. 따라서 실 매개변수의 값은 피 호출 함수가 실행된 후에도 변하지 않는다. 이와 같은 기법은 주로 함수(sub program)에 값을 전달하고 실 매개변수의 값을 원형대로 보존하기 위하여 사용한다.
따라서 실 매개변수의 값이 피 호출 함수의 형식 매개변수에 복사되기 때문에 값의 참조가 빠르다. 그리고 함수의 실행 후에도 실 매개변수의 값이 변경되지 않아 자료의 보호가 가능하다. 그러나 형식 매개변수에 대한 기억 공간을 별도로 마련해야 하기 때문에 기억의 장소의 소모가 크고, 배열과 같은 자료는 복사에 많은 시간이 소모된다.
C언어 에서는 배열을 call-by-value의 매개변수로 취할 수 없는데 C언어에서 배열명은 배열의 시작주소를 나타내는 포인터이기 때문이다.
 

#include <stdio.h> // call-by-value 이용한 제곱 계산

int sqrt(int); // 함수선언

void main()

{

        int result, var;

        var=10;

        result = sqrt(var); // 매개변수 var

        printf("%d, %d", result, var); // 10, 100

}

int sqrt(int x)

{

        x = x*x;

        return x ; // main 함수에 x 반환

}

 

 


(2) call-by-reference
  call-by-reference는 실 매개변수의 주소를 형식 매개변수에 복사하여 형식 매개변수는 전달반은 주소로 실 매개변수의 값을 간접적으로 조회하는 기법이다. 즉 형식 매개변수의 값이 실 매개변수의 값이 서로 연결되어 전달되는 효과를 가진다.
실 매개변수는 전달할 변수의 주소를 값으로 하고, 형식매개변수는 그 주소의 값을 받아들일 수 있는 포인터 변수로 하여 구현 할 수 있다.
call-by-reference는 주소에 의하여 값을 간접적으로 조회하기 때문에 조회 시간이 걸리지만, 방대한 자료와 복사가 이루어지지 않기 때문에 call-by-value에 비하여 기억 공간의 낭비를 줄일 수 있다.

#include <stdio.h>

void sqrt(int *x);  // 함수선언

void main()

{

        int var;

        var=10;

        sqrt(&var); // 매개변수 주소값을 넘긴다

        printf("%d", var);

}

void sqrt(int *x) // var 주소를 x 복사(x 포인터 변수죠 ㅎㅎ)

{

        *x = *x * *x;   // x var처럼 사용합니다. 그러면 var값이 자동으로 바뀌겠죠

}

 

 

위 예제에서는 간단한 정수현 변수 하나만을 매개변수로 하였기 때문에 call-by-value와 call-by-reference의 차이를 느끼기 힘들지만, 배열과 같은 크기가 큰 자료를 매개변수로 취할 경우에는 call-by-reference가 더 효율적이다. 


저작자 표시
신고

'Language > C' 카테고리의 다른 글

매개변수 전달 기법  (0) 2012.02.17
배열(Array)  (0) 2012.02.17
포인터(Pointer)  (0) 2012.02.17
숫자 baseball game  (0) 2012.02.16
난수 생성 srand 함수  (0) 2011.05.27
지역 변수와 전역 변수  (0) 2011.05.22

배열(Array)이란 C프로그램에서 사용하는 자료구조의 한 형식으로, 동일한 크기와 동일 한자료 형태의 원소를 나열한 자료의 집합을 말한다.
예를 들어 정수형 변수 5개를 선언하게 된다면 다음과 같을 것이다.

int x1, x2, x3, x4, x5;

그러나 이러한 자료 저장 방식은 대량의 자료를 저장하기에는 한계가 있다.
이러한 한계를 극복하기 위하여 배열이 있는 것이다. 

// 배열의 선언 
char ch1[10];   // 문자형 1차원 배열
int number[10];   // 정수형 1차원 배열 
float number2[10][10];  // 실수형 2차원 배열 


기본적으로 자료형 중에서 문자형(char)은 1byte, 정수형(int)과 실수형(float)는 4byte, 그리고 실수형(double)은 8byte를 차지한다. 그러면 배열의 크기를 나타내는데 이것에라 저장공간을 다음과 같이 계산한다.

배열 저장공간 크기 = 자료형 크기 * 배열의 원소 수

char ch1[10]; // 저장공간 크기 1 * 10 = 10byte

int number[10]; // 4 * 10 = 40byte;

float number2[10][10]; // 4 * 10 * 10 = 400byte;

 

-----------------------------------------------------------------------------
배열 요소 접근 : 
임의의 위치에 존재하는 배열 요소에 인덱스(요소의 위치)를 통해 접근할수 있다.
배열 요소는 0 부터 시작한다.
(ex.) array[0] : 첫 번째 요소 접근)

배열 초기화 :
int arr1[5] = {1, 2, 3, 4, 5};
int arr2[] = {1, 2, 3, 4, 5};           // int 형의 배열 요소가 5개인 arr2 배열 선언
int arr3[5] = {1, 2};                 // 1, 2, 0, 0 ,0   언급하지 않은건 0 으로 초기화 

배열을 이용한 문자열의 표현

char ch[] = "hahahia"; // h, a, h, a, h, i, a, NULL : char형의 배열요소가 8개의 ch배열 선언

 


   h          a         h          a          h         i            a           NULL
ch[0]   ch[1]    ch[2]   ch[3]    ch[4]   ch[5]     ch[6]       ch[7] 

(참고 : 문자열 끝에는 문자열 끝을 표시하기 위해 NULL 문자가 자동으로 삽입된다.
          NULL 문자는 출력되지 않는다.) 


저작자 표시
신고

'Language > C' 카테고리의 다른 글

매개변수 전달 기법  (0) 2012.02.17
배열(Array)  (0) 2012.02.17
포인터(Pointer)  (0) 2012.02.17
숫자 baseball game  (0) 2012.02.16
난수 생성 srand 함수  (0) 2011.05.27
지역 변수와 전역 변수  (0) 2011.05.22
포인터 : 주소값을 직접 컨트롤을 하기 위해, 실제 어떤 주소값을 저장하는 변수.
            주소값의 크기는 4byte이며 따라서 포인터의 크기도 4byte.

example)

int 포인터 : int* p; or int *p; (* 위치는 상관없다)

char 포인터 : int *cp; or int* cp;

 


변수명 앞에 &를 붙이게 되면, 그 변수의 처음 메모리 주소값을 반환한다. 
그렇게되면 배열을 하나(ex, char ch[10])를 선언하고 &ch를 출력하게되면 배열 ch의 첫번째 메모리 주소값인 ch[0]의 주소를 출력할 것이다.

int main(){

 int i = 5;

 int *pi; // == int* pi; equal

 

 pi = &i;

 

no1::  cout<<i<<endl;     //= 5

no2:: cout<<&i<<endl;//0012FF60

no3:: cout<<pi<<endl;//0012FF60

no4::   cout<<&pi<<endl;//0012FF54

no5::   cout<<*pi<<endl;  // 5

 return 0;

}

 

 

1번 :: i의 값은 5
2번 :: & (reference)는 주소값을 의미합니다. 따라서 i의 주소값은 0012FF60
3번 :: pi는 i의 주소값을 가리키는 포인터입니다. 따라서 0012FF60
4번 :: pi라는 변수의 주소값은
0012FF54입니다.
5번 :: pi가 가리키고 있는 주소의 값은
5입니다. 


저작자 표시
신고

'Language > C' 카테고리의 다른 글

매개변수 전달 기법  (0) 2012.02.17
배열(Array)  (0) 2012.02.17
포인터(Pointer)  (0) 2012.02.17
숫자 baseball game  (0) 2012.02.16
난수 생성 srand 함수  (0) 2011.05.27
지역 변수와 전역 변수  (0) 2011.05.22

#include <stdio.h>

#include <time.h>

#include <stdlib.h>

 

int main()

{

        int number[3];

        int usernumber[3];

        int _answernumber, _usernumber, i, j;

        char input[10];

        int out, ball, strike;

        int count=0;

        srand(time(0));

        for(i=0; i<3; i++)

        {

               number[i] = rand()%9 + 1; // 난수생성

        }

        while(number[0]==number[1] || number[0]==number[2] || number[1]==number[2]) // 중복처리

        {

               for(i=0; i<3; i++)

               {

                       number[i] = rand()%9 + 1; // 난수생성

               }

        }

        _answernumber = (number[0] * 100) + (number[1] * 10) + number[2];

        _usernumber = 0;

        printf("======================baseball game======================\n");

        while(_answernumber != _usernumber)

        {

               out=0; //Ball count

               ball=0;

               strike=0;

               printf("3  (   X) : " );

               scanf("%s", input);

               _usernumber = atoi(input);

               usernumber[0] = _usernumber/100;

               usernumber[1] = (_usernumber - usernumber[0]*100)/10;

               usernumber[2] = (_usernumber - usernumber[0]*100 - usernumber[1]*10);

               while(_usernumber > 1000 || _usernumber < 100 || usernumber[0]==usernumber[1] || usernumber[0]==usernumber[2] || usernumber[1]==usernumber[2])

               {

                       printf("3  (  X) : ");

                       scanf("%s", input);

                       _usernumber = atoi(input);

                       usernumber[0] = _usernumber/100;

                       usernumber[1] = (_usernumber - usernumber[0]*100)/10;

                       usernumber[2] = (_usernumber - usernumber[0]*100 - usernumber[1]*10);

               }

               for(i=0; i<3; i++)

               {

                       if(number[i]==usernumber[i])

                              strike++;

               }

               for(i=0; i<3; i++)

               {

                       for(j=0; j<3; j++)

                       {

                              if(i!=j && number[i] == usernumber[j])

                                      ball++;

                       }

               }

               out = 3 - strike - ball;

 

 

               printf("%d Strike, %d Ball, %d Out\n", strike, ball, out);

               count++;

        }

        printf("%d   \n", count);

        return 0;

}

 

 


저작자 표시
신고

'Language > C' 카테고리의 다른 글

배열(Array)  (0) 2012.02.17
포인터(Pointer)  (0) 2012.02.17
숫자 baseball game  (0) 2012.02.16
난수 생성 srand 함수  (0) 2011.05.27
지역 변수와 전역 변수  (0) 2011.05.22
C언어 함수  (0) 2011.05.22

/* made by hahahia */

#include <stdio.h>

#include <time.h>

#include <stdlib.h>

void main()

{

        int A, i;

        srand(time(NULL));

        for(i=0; i<100; i++){

               A=rand()%100+1;

               printf("  %d ", A);

        }

}

 

그냥뭐... srand 쓸 줄 알면 되는거같다 ㅎ

신고

'Language > C' 카테고리의 다른 글

포인터(Pointer)  (0) 2012.02.17
숫자 baseball game  (0) 2012.02.16
난수 생성 srand 함수  (0) 2011.05.27
지역 변수와 전역 변수  (0) 2011.05.22
C언어 함수  (0) 2011.05.22
ab + ba = 99 를 만족하는 a, b값 구하는 프로그램  (0) 2011.05.13
¢지역 변수의 의미

: 지역 변수(local variable)는 함수의 블록 안에 선언된 변수. , 중괄호 내에 선언된 변수.

¤지역 변수는 해당 지역 변수의 선언을 포함하는 함수 내에서만 접근이 가능
¤지역 변수는 함수가 호출될 때 메모리상에 올라갔다가, 함수가 종료되면 메모리상에서 사라짐.
¤지역 변수는 외부에 선언된 동일한 이름의 변수를 가릴 수 있다.
¤모든 매개 변수는 지역 변수다.
¢전역 변수의 의미

  : 전역 변수(global variable)는 함수 밖에 선언된 변수

¤프로그램이 시작하자마자 메모리 상에 올라가서 프로그램이 종료될 때까지 계속 존재
¤프로그램 어디에서든 접근 가능
¤모든 함수에서 공유할 수 있는 저장공간을 이용할 수 있는 장점이 있으나, 어느 한 함수에서 잘못 다루면 모든 함수에 영향을 미치는 단점도 있다.

¢
전역 변수 와 지역 변수 사용 예

#include <stdio.h>

int val = 0;

void fct(void);

int main(void)

{ 

    val=10;

  printf(“val : %d \n”, val);

  fct();

  printf(“val : %d \n”, val);

  return 0; 

}

void fct(void)

{ 

  int val = 20;

  val++;

  printf(“fct val : %d \n”, val);

}

결과 : val : 10

         fct val : 21

      val : 10


신고

'Language > C' 카테고리의 다른 글

숫자 baseball game  (0) 2012.02.16
난수 생성 srand 함수  (0) 2011.05.27
지역 변수와 전역 변수  (0) 2011.05.22
C언어 함수  (0) 2011.05.22
ab + ba = 99 를 만족하는 a, b값 구하는 프로그램  (0) 2011.05.13
break와 continue의 차이  (0) 2011.05.13
¢함수는 프로그램을 구성하는 기본적인 구성 요소
¢하나의 프로그램은 여러 함수들이 모여서 이루어짐
¢다른 함수들과 데이터를 주고받을 수 있음
¢일단 만들어지면 다른 프로그램에서도 사용될 수 있다.
¢코드의 재활용이 가능해지고 가독성이 증대되며 유지관리가 쉬워짐.
¢함수는 특정한 작업을 수행하는 독립적인 부분으로 일련의 처리를 담당하는 문장들의 집합.
¢프로그램의 다른 부분에서 함수를 불러서 사용하는 것을 함수 호출이라고 함.
¢, 함수는 입력이 주어지고 이 입력을 이용하여 특정작업을 수행하여 그 결과를 반환하는 프로그램의 기본적인 구성 단위. 

Input X -> Function -> Output Y

¤컴파일러는 중괄호가 시작되기 전까지 부분을 "함수의 헤더"로 판단, 그리고 중괄
호로 묶인 부분을
"함수의 바디"로 판단
¤함수의 이름으로는 식별자(identifier)를 사용
¤함수의 "파라메터리스트"에는 한 개의 변수 선언이 올 수도 있고, 여러 개의 변수 선언이 올 수도 있음. 여러 개의 변수가 올 경우, 콤마(,)를 이용해서 구분. 변수 선언이 오지 않을 경우에는 생략하고 괄호를 닫거나 "void"를 추가
¤return문은 결과를 되돌려주는 역할을 함. 리턴타입에는 되돌려질 결과 값의 형태(type)를 정의함. "리턴타입"이 없을 경우에는 void를 씀
¤바디 부분에 포함될 "변수 선언부""실행 코드부"의 순서는 반드시 지켜야 함. 참고로, C++에는 이러한 순서에 제약이 없어졌음


 함수의 예제

#include <stdio.h>

void message(int number);      // 화면에 메시지 출력  

int sum(int start, int end);        // 일정 범위의 합 계산  

void main(void) {

    int a=3, b=7;

    int result;

    message(1);

    result = sum(a,b);

    message(2);

    printf("%d부터 %d까지 합 == %d\n", a, b, result);

}

void message(int number) {

    printf("위치 : %d\n",number);

}

int sum(int start, int end) {

    int i, sum = 0;

    message(3);

    for(i = start;i<=end;i++) 

        sum += i;

    message(4);

    return sum;

    message(5);                 

       
// return문 뒤의 문장은 수행 되지 않음

}



 
신고

/* made by hahahia */

 

#include <stdio.h>

 

void main()

{

        int i, j;

        for(i=0; i<=9; i++) {

               for(j=0; j<=9; j++) {

                       if(i*10 + j + j*10 + i == 99)

                       {

                              if(i == 0)

                              {

                                      printf("%d + %d%d = 99\n", j , j , i);

                                      printf("a = %d, b = %d\n", i , j);

                              }

                              else if(j==0)   

                              {

                                      printf("%d + %d%d = 99\n", i , i , j);

                                      printf("a = %d, b = %d\n", i , j);

                              }

                              else {

                                      printf("%d%d + %d%d = 99\n", i,j, j,i);

                                      printf("a = %d, b = %d\n", i, j);

                              }

                       }

               }

        }

}

 

신고

/* made by hahahia */

#include <Stdio.h>

int main()

{

        int i, j, k;

        for(i=0; i<2; i++) {

               printf("i loop in\n");

               for(j=0; j<2; j++) {

                       printf("j loop in\n");

                       for(k=0; k<2; k++) {

                              printf("k loop in\n");

                              continue; // continue에서는 k loop out 출력이안되고바로다시 k루프를 돈다.                                                

// break 에서는 k loop out 출력이안되고 k루프를 아예 빠져나온다.                     printf("k loop out\n");

                       }

               printf("j loop out\n");

               }

        printf("i loop out\n");

        }

        return 0;

}


실행결과


신고

/* made by hahahia */

 

#include <stdio.h>

 

int main()

{

     int n, i, fact=1;

     printf("input n(1~15) : ");

     scanf("%d", &n);

     for(i=1; i<=n; i++)

    {

          fact *=i;

    }

     printf("%d! = %d\n", n, fact);

      return 0;

} // for 문을 이용한 factorial program

 

 

#include <stdio.h>

 

int main()

{

      int n, i=0, fact=1;

      printf("input n(1~15) : ");

      scanf("%d", &n);

      while(i<n)

     {

          i++;

          fact *=i;

      }

      printf("%d! = %d\n", n , fact);

 return 0;

} // while 문을 이용한 factorial program

 

 

#include <stdio.h>

 

int main()

{

     int n, i=0, fact=1;

     printf("input n(1~15) : ");

     scanf("%d", &n);

    do{

            i++;

            fact*=i;

    }while(i<n);

    printf("%d! = %d\n", n, fact);

    return 0;

// do while 문을 이용한 factorial program

신고

+ Recent posts