자동변수(지역변수)

- 하나의 함수 내부에 선언한 변수

- 변수의 기억공간이 할당되는 시점은 각 변수가 속해 있는 함수가 호출되어 실행될 때이다

 

예제)13-1

메인함수에서 두 수를 입력받아 곱하는 프로그램

곱하는 작업은 리턴값이 없는 함수를 이용

#include <stdio.h>


void func(int *, int *, int *);     //함수선언

 

int main(){

int a, b, c;

 

printf("두 수를 입력하세요");
scanf_s("%d %d", &a, &b);

 

func(&a, &b, &c);
printf("%d", c);

 

return 0;

}

 

void func(int* a, int* b, int* c){
    *c = (*a)*(*b);   //두 변수 a,b를 곱한 값을 c에 대입한다.
}

 결과)


 

 

정적변수

- 기억공간의 생성과 초기화가 함수의 호출 횟수에 영향을 받지 않는 변수

- 선언 방법 ex) static int sum;

 

예제)13-2

메인에서 배열요소값 출력하는 프로그램

함수가 호출될 때마다 배열요소값 차례로 리턴하는 함수 이용

#include <stdio.h>

 

int* func();    //함수 선언

 

int main(){
    int i;
    int* p;
    for (i = 0; i < 5; i++){
        p = func();    //함수 대입
        printf("%d번째 배열 요소 : %d\n",(i+1), *p);    //배열 출력
    }
    

return 0;

}

 

int* func(){
    int array[] = { 1, 2, 3, 4, 5 };
    static int sum = 0;   //정적변수 선언
    sum++;
    return &array[sum-1];    //배열에 저장된 값 리턴
}

결과)



 

 

외부변수

- 변수를 함수 밖에서 선언한다.

 

예제)13-3

get_next 함수 : 현재 배열 요소의 값을 리턴하고 다음 배열 요소로 이동

get_before 함수 : 현재 배열 요소의 값을 리턴하고 이전 배열 요소로 이동

#include <stdio.h>

 

int array[] = { 1, 2, 3, 4, 5 };    //배열 선언

 

int get_next();        //함수 선언
int get_before();    //함수 선언

 

static int sum = 0;  //외부변수 선언

 

int main(){
 

printf("next함수 호출 : %d\n",get_next());

printf("next함수 호출 : %d\n", get_next());   
    

sum++;

 

printf("before함수 호출 : %d\n", get_before());
printf("before함수 호출 : %d\n", get_before());

 

return 0;

 

}

 

int get_next(){
    sum++;    //배열 인덱스 증가
    return array[sum-1];
}

 

int get_before(){
    sum--;    //배열 인덱스 감소
    return array[sum];
 
}

결과)

 

 

포인터 배열

- 포인터변수들로 만들어진 배열(문자열 상수)

 

예제)14-4

포인터배열을 사용해 가장 긴 단어 출력하기

#include <stdio.h>
#include <string.h>

 

int main(){

 

char* array[] = { "dog", "elephant", "monkey", "rabbit", "tiger" };   //포인터배열 선언
int i, j;
char* max = array[0];

for (i = 0; i < 5; i++){    //max보다 길이가 긴 배열요소를 max에 대입한다.
    if (strlen(array[i]) > strlen(max)) max = array[i];    //strlen() : 문자열 사이즈 측정함수
}
 
printf(max);
printf("\n");

 

return 0;

}

결과)

 

 

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

C언어 정리(8)  (0) 2015.08.09
C언어 정리(7)  (0) 2015.08.07
C언어 정리(5)  (0) 2015.07.20
C언어 정리(4)  (0) 2015.07.20
C언어 정리(3)  (0) 2015.07.20

수체계

 

10진수

- 0~9로 이루어진 수체계

 

2진수

- 0과 1로 이루어진 수체계

 

16진수

- 0~9, A~F로 이루어진 수체계

 

16진수 → 2진수

 

24D(2)

D : 13 => 1101(2)

      4 => 100(2)

      2 => 10(2) 

24D(16) = 001001001101(2)

 

 

10진수 → 16진수

 

1324

① 1324/16 = 82.xx

    1324 - (82×16) = 12 : C(16)

② 82/16 = 5.xx

    82 - (5×16) = 2

③ 5/16 = 0.xx

    5 - (0×16) = 5

1324 = 52C(16)

 

 

 

 

메모리

 

- 기본단위 : 1byte

 

주소

0

1

2

3

4

5

6

7

메모리

2A

45

B8

20

8F

CD

12

2E 

 

- 단위

  word 4byte    double word 4byte    quad word 8byte    pharagraph 16byte

 

- 문자는 문자코드를 사용하여 저장

  ASCII        하나의 문자를 인코딩하기 위해 1byte 사용

  Unicode    하나의 문자를 인코딩하기 위해 2byte(1worD) 사용(ASCII보다 더 많은 문자 맵핑 가능)

 

 

 

Segment:Offset

 

- 메모리가 Segment라고 불리는 바이트의 집합으로부터 분리

- Segment는 Offset번호를지정하여 메모리에 접근

- 데이터에 접근할 때 Segment번호:Offset번호의 리퀘스트를 보낸다

  ex)물리적 주소로 변환하기 : 1234:4321 => 1234×10h+4321 = 16661

 

레지스터

- 데이터를 저장할 수 있는 작은 영역

- 프로그램 실행 중 정보를 저장

- 레지스터 내의 저보 접근이 메모리에 접근하는 것보다 빠름

-레지스터 번호는 제한되어 있다.

 

일반적인 특성을 위한 레지스터(16비트로 구성) :

종류

구성 

용도 

AX

AH, AL

수학연산, I/O연산, INT 21

BX

BH, BL

Base 또는 Pointer

CX

CH, CL

루프 or 반복

DX

DH, DL

다양한 데이터, 문자 출력

- 386이 나온 경우 새로운 레지스터 EAX, EBX, ECX, EDX가 추가됨(32비트로 확장)

EAX

               

AH

AL

AX

 

 

 

 

세그먼트 레지스터 :

종류

용도

CS

코드를 저장하는 메모리 블록

DS

데이터를 저장하는 메모리 블록

EX

비디오 관련된 것을위해 사용

SS

루틴으로부터 리턴 어드레스 저장을 위해 프로세서에 의해서 사용되는 레지스터

 

 

인덱스 레지스터 :

종류

용도 

SI 

문자열/배열의 소스를 지정하기 위해 사용

DI 

문자열/배열의 목적지를 지정하기 위해 사용

IP

다음 명령의 주소를 저장하고 직접적으로 변경할 수 없음

 

 

 

문자열의 처리

 

char* fruit = "apple";    //문자열 상수"apple"을 포인터변수에 대입

 

/* --------------------------------------------

for(int i=0;i<sizeof(fruit);i++){

printf("%s", fruit[i]);              //결과 : apple

}

--------------------------------------------*/

/* -------------------------------------------------------------------------------

fruit[0] = 'a'

fruit[1] = 'p'

fruit[2] = 'p'

fruit[3] = 'l'

fruit[4] = 'e'

--------------------------------------------------------------------------------*/

 

while(*fruit != \0){             //*fruit은 포인터변수 fruit(주소값)을 참조. 즉, apple과 같음

printf("%s\n", fruit);    //fruit에 저장된 값을 문자형으로 출력

fruit++;                       //주솟값을 1 증가

}

따라서 결과는

apple

pple

ple

le

e 

 

 

 

중요한 문자열 처리 함수

 

문자배열에 문자열상수를 저장하기

 

 

void user_strcpy(char* des, char* src)        //des : 선언한 배열 대입 & src : 저장할 문자열 상수 대입

{

while(*src != '\0'){                          

*des = *src;                                //선언한 배열 자리에 저장할 문자열요소 대입

src++;                                        //주소값 1씩 증가

des++;                                       //주소값 1씩 증가

}

*des='\0;                                       //마지막 자리 NULL값 대입

}

이 함수를 사용한다.

 

 

 

문자열 복사함수

 

"string.h"헤더파일에 선언되어있는 char* strcpy(char* , char* ) 함수를 사용한다.

 

...

#include<string.h>          //선언

...

char str1[20] = "apple";

char str2[20] = "banana";

char temp[20];                //임시 저장 배열 선언

 

strcpy(temp, str1);          //temp에 str1 저장

strcpy(str1, str2);           //str1에 str2 저장

strcpy(str2, temp);         //str2에 temp(원래 str1) 저장 

 

 

 

문자열의 길이를 계산하는 함수

 

unsigned int strlen(char* ) 함수를 사용한다.

 

char fruit[80] = "apple";

int len;

len = strlen(fruit);

printf("%d", len);                //5

printf("%d", sizeof(fruit));    //80

 

 

 

문자열을 비교하는 함수

 

"string.h"헤더파일에 선언되어 있는 int strcmp(char* str1, char* str2) 함수를 사용한다.

 

크기비교 

str1 > str2

str1 < str2

str1 == str2

리턴값

1

-1

0

 

...

#include<string.h>          //선언

... 

char str1[20] = "banana";

char str2[20] = "apple"; 

char temp[20];                    //임시 저장 배열 선언

int res;

 

res=strcmp(str1, str2);

if(res>0){                          //str1 > str2인 경우

strcmp(temp, str1);       //temp에 str1 저장

strcmp(str1, str2);        //str1에 str2 저장

strcmp(str2, str1);        //str2에 temp(원래 str1) 저장 

}

 

 

 

두 개의 문자열을 붙이는 함수

 

"string.h"헤더파일에 선언되어 있는 char* strcat(char* str1, char* str2)함수를 사용한다.

 

...

#include<string.h>          //선언

... 

char fruit[80] = "straw";

 

strcat(fruit, "berry"); 

 

 

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

C언어 정리(7)  (0) 2015.08.07
C언어 정리(6)  (0) 2015.08.06
C언어 정리(4)  (0) 2015.07.20
C언어 정리(3)  (0) 2015.07.20
C언어 정리(2)  (0) 2015.07.20

+ Recent posts