-문자 입력받기(getch)



2번째 줄 : getch() 함수가 선언되어 있는 헤더파일 (conio.h)을 포함한다. getch() 함수의 원형은 다음과 같다.
            
  int getch(void)

4번째 줄 : 엔터키 값은 아스키 코드가 13이다.

15번째 줄 : getch() 함수는 키보드로부터 문자를 한 개 입력받아서 int형으로 반환한다. 그래서 int형 변수인 ch에 값을 대입하는 것이다. 또한, getch() 함수는 숫자, 대.소문자 외에 특별한 값을 입력받는데, 그 것은 F1~F12, Ctrl + a ~ Ctrl + z, Home, End, PgUp, PgDn, 방향키 등이다. 이 특별한 값을 입력받는 경우, getch() 함수는 두 번에 걸쳐 키 값을 읽어 온다. 예를 들어 F1키를 누르면 첫 번째 getch() 함수 호출 시에는 아스키 값이 0이 읽혀지며, 두 번째 getch() 함수 호출 시에는 아스키값 59가 읽혀진다.

17번째 줄 : 키보드로부터 읽은 문자와 아스키 코드값을 출력한다.

19번째 줄 : 엔터값이 입력될 때까지 계속 반복하여 키를 입력받는다.

 <결과>



 
Posted by 츠큐파 ChQPa

댓글을 달아 주세요



매크로는 함수 대신에 사용하는 것으로써, 위 소스코드와 같이 짧은 문장에 주로 사용되며, 복잡한 문장을 단순화 하기 위해서도 사용한다. 매크로를 정의하기 위해서는 #define 문을 사용한다.

3번째 줄 : 최대값을 구하는 매크로 MAX를 작성한다. 주어진 a,b는 함수에서처럼 인수의 역할을 하며, 16번째 줄에서 사용된 MAX(i,j)를 " i > j ? i : j "로 치환해준다

4번째 줄 : 최소값을 구하는 매크로 MIN를 작성한다. 주어진 a,b는 함수에서처럼 인수의 역할을 하며, 17번째 줄에서 사용된 MIN(i,j)을 " i < j ? i : j "로 치환해준다

여기에 사용된 MAX(i,j)가 매크로이므로 이 문장은 컴파일러에 의해 다음처럼 변경된다.

printf("최대값은 %d입니다.\n", i > j ? i : j );

즉, 매크로는 함수와는 전혀다르며, 매크로를 사용한 모든 곳은 위와 같이 해당 매크로가 선언된 문장처럼 컴파일 시 자동으로 변경된다.
Posted by 츠큐파 ChQPa

댓글을 달아 주세요



이번 포스트를 읽어보시면 변수의 범위를 쉽게 이해 할 수 있다.
trust and follow me.

우선 위에 올려놓은 소스코드를 분석하며 차근차근 설명하겠다.

3,4번째 줄 : print_x(int x), print_gx(void)함수를 선언한 것이다.

6번째 줄 : 전역변수 x를 정의하고 20으로 초기화 한다. 전역변수는 함수의 밖에서 정의 되며 일반적으로는 main()함수 전에 정의한다는 사실을 알아두자. 또 이해를 돕기위해 한마디하자면 전역변수는 소스코드내 전지역에서 사용할 수 있게 정의된 변수를 말한다.

10번째 줄 : 지역변수 x를 정의하고 5로 초기화하였다. 지역변수는 함수내에서 전역변수보다 참조우선순위가 높다는점 알아두자.

11번째 줄 : 함수내에서는 지역변수가 우선순위를 갖기 때무에 5가 출력이 될 것이다. main()함수 내에서 지역변수 x를 정의하였기 때문에 전역변수 x는 사용할 수 없다.

13번째 줄 : print_X() 함수를 호출한다. 인수값은 보이다시피 10이다.

14번째 줄 : print_gx를 호출한다.

20번째 줄 : 인수로 넘어온 x를 출력한다. 함수내에서는 인수 값으로 사용되는 지역변수가 전역변수보다 우선하여 사용되기 때문에 10이 출력되며 마찬가지로 이함수 내에서도 전역변수 x를 사용할 수 없다.

25번째 줄 : 전역변수 x를 출력한다. 출력 값은 앞서 선언했다 시피 20이 되며, 함수내에서 사용된 지역변수가 없기 때문에 6번째 줄에서 정의한 전역 변수가 x가 사용되는 것이다.



<결과>

ChQPa
Posted by 츠큐파 ChQPa

댓글을 달아 주세요





앞에서 보았던 포인터에 더하여 문자열포인터 배열포인터 사용에 대해 간단히 설명하고자 한다.

 

 - 문자열 포인터


char* pstr = "Chqpa";

pstr을 문자열 "Chqpa"를 사용할 수 있는 분신으로 지정한다. 이 정의에 의해 문자열 "Chqpa"를 사용할 모든 곳에 pstr을 사용할 수 있다. 단, 앞에서 보았던 분신 연산자'&'를 문자열에서는 사용하지 않는다. 왜냐면, 문자열 자체가 이미 분신이기 때문이다. 문자열을 정의하면 문자열의 본체는 메모리의 어딘가에 저장되고, 그 분신이 자동적으로 만들어진다. 문자열은 항상 분신을 지니고 있기 때문에, 특히 분신 연산자를 사용할 필요는 없는 것이다. 예를 들어, 다음의 문장은 출력 결과과 모두 Chqpa가 될 것이다

puts("Chqpa");
puts("pstr");




  - 배열 포인터


char string[100] = "Chqpa";
char* pstr = string;

문자형 포인터 pstr을 배열 변수에 대한 분신으로 지정한다. string은 문자열 "Chqpa"로 초기화될 뿐, 문자열 "Chqpa"의 분신은 아니다. 단지 값을 넘겨받는 것이다. 하지만 pstr은 문자형 배열 변수 string의 분신으로 정의된 것이다. 이 정의에서도 분신 연산자'&'를 사용하지 않았는데, 그 이유는 string이 배열을 대표하는 분신이기 때문이다. 예를 들어, 다음과 같이 한다면 세 문장의 출력 결과는 완전히 같을 것이다.

puts("Chqpa");
puts(string);
puts(pstr);

또한, pstr이 string의 분신이기 때문에 string[0]과 pstr[0]은 그 값이 같다.



ChQPa
Posted by 츠큐파 ChQPa

댓글을 달아 주세요

  1. croute 2011.03.08 21:48 Address Modify/Delete Reply

    분신이란 표현 좋네요.
    사실상 pstr 은 string을 포인팅 하고 있는거지요.
    이때 원래의 char 변수는 1byte 만을 할당받지만,
    char *pstr은 4byte를 할당 받습니다.
    C언어에서 주소값은 4byte로 이루어져있기때문이죠.
    쉽게 생각하면 모든 포인터는 4byte 의 메모리를 할당받습니다.
    앞에 있는 char 등의 데이터타입은 실제 그만큼의 메모리를 할당받게 하는 역할이 아닌,
    다만 이 포인터가 어떤 데이터타입의 변수를 포인팅하고있는지를 명시적으로 보여주는 것이지요.

    • 츠큐파 ChQPa 2011.03.08 22:36 신고 Address Modify/Delete

      추가적으로 적어주셨네요 감사합니다 ㅋㅋㅋㅋ
      실무진은 역시 달라도 몬가 다르진 않네요 ㅋㅋㅋ

      하하하하;;;; 농담입니다.ㅋㅋㅋ



오늘은 C언의 꽃이라고 할 수 있는 포인터(Pointer)에 대해서 알아보도록 하겠다.

포인터는 C언어로 프로그래밍을 할 때 감초처럼 사용된다. C언어는 어셈블리 언어와 더불어 저수준 언어라고 하는데, 그 이유는 컴퓨터의 하드웨어적인 부분과 밀접하게 관련되어 프로그래밍을 하기 때문이다. 이런 저수준 언어에서 볼 수 있는 특징이 메모리를 직접 접근하여 사용하는것이며, C언어로 메모리를 직접 접근하기 위해 사용하는것을 포인터라고 한다.

위 소스코드를 보며 설명을 해 보겠다.

6,7번째 줄 : 정수형 변수 saram_A,saram_B를 정의하고 0으로 초기화 한다.

8,9번째 줄 : 정수형 변수 pointer, psaram을 정의한다. 일반적인 변수와 정의하는 방법이 조금다르다는 것을 알 수 있다.  일반 변수의 정의 달리 포인터를 정의하기 위한 변수임을 알리는 별표(*)가 사용되었다.

11번째 줄 :  포인터 변수 pointer를 saram_A의 분신으로 지정합니다.(여기서 분신이라 함은 saram_A의 역할을 그대로 할 수 있는 의미를 부여하는 것 이다. 일란성 쌍둥이라고 비유해도 되겠다. 겉모습은 물론이거니와 DNA까지 모두 똑같은, 설명을 쉽게 하기 위해 '분신'이라는 단어를 사용하겠다.) 일반적으로는 변수를 그냥 대입하지만, 분신을 만들기 위해서는 분신 연산자 '&'를 사용해야 한다. pointer = saram_A가 아니라 pointer = &saram_A 라고 되어 있는 것을 볼 수 있다. 그렇다면 '&'는 무슨 역할을 할까? 이것은 바로 saram_A와 같은 기능을 할 수 있는 pointer라는 분신을 만든다는 것이다. 여기서 pointer는 saram_A와 똑같은 생각을 하고, 똑같은 행동을 할 수 있다고 한다.

12번째 줄 : 이제 분신을 사용한다. 변수 saram_A에 1을 대입하려면 saram_A = 1 이라고 한다. 그런데 약간 이상하다. pointer = 1 이 아니라 *pointer = 1 이다. 왜그럴까? 그것은 pointer가 분신 변수이기 때문이다. pointer라는  것은 saram_A의 분신을 만들 때 사용하는 것이다. saram_A의 부신이 되고 나서 saram_A를 대신해서 사용할 때는 *pointer라고 해야한다. *pointer = 1 이라고 하면 Saram_A의 값이 1이 되며, *pointer = 2 라고 하면, saram_A의 값이 2가 된다. 거꾸로, saram_A = 1 이라고하면 *pointer의 값도 1이 된다.

13번째 줄 : saram_A의 값은 0으로 초기화되었는데, saram_A를 출력해 보면 1이 나온다. 그것은 saram_A의 분신인 pointer를 통해서 1을 대입 받았기 대문입니다. 물론, 분신의 값(*pointer)을 출력해도 1이다.

어떻게 이해가 잘 됐는지 모르겠지만
다음 소스코드부터는 다를 숫자를 대입해보고 그 숫자에 각 변수들이 어떻게 변하는지에 대해서 나와있으므로 혼자서 이해하기에 큰 무리가 없을 것으로 보고 설명은 이로써 마치겠다.




<결과>
Posted by 츠큐파 ChQPa

댓글을 달아 주세요



위의 예제는 파일입출력에 대한 것인데,
 한눈에 보아도 fopen이라는 함수의 역할을 알 수 있다.(당연히 파일을 여는 역할을 하는 함수이다.)

FILE *fopen(const char *filename, const char *mode);
첫뻔재 매개변수는 파일이름, 두번째 매개변수에는 옵션이 들어가는 밑에 옵션을 정리해 놓았다.

fp = fopen("si.txt"","r");
괄호안에 두가지가 있는데 앞에 "si.txt", 불러올 파일명을 나타내고 뒤에 "r"은 불러오는 파일에 대한 옵션을 나타낸다.

 -옵션에 대해 알아보자.

"r" - 읽기 전용
"w" - 쓰기전용
"a" - 이어쓰기, 만약에 파일이 없으면 새로 생성한다.
"r+" - 읽기/쓰기
"w+" - 빈파일 생성, 먄약 파일이 있으면 기존파일을 지워버리고 새로 생성한다.
"a+" - 이어쓰기, 만약 파일이 없으면 새로생성한다.


그렇다면 fgets함수는 무엇일까?

char *fhets(char *string, int n. FILE *stream);
첫번째 매개변수는 세번째 매개변수인 파일 스트림으로부터 문자열을 저장할 char*를 넣어준다.(char 배열)
두번째 정수형 변수  n은 불러들일 문자열의 길이를 나타낸다.
세번째 매개변수는 파일스트림인 파일포인터를 넣어둔다.


ChQPa

Posted by 츠큐파 ChQPa

댓글을 달아 주세요