'Programming/C'에 해당하는 글 22건

Pointer

Programming/C 2006. 10. 4. 10:59
포인터 (Pointer)

다른 변수의 주소를 그 값으로 가지는 변수이다.
번지를 알아내는 연산자 &를 사용해서 p에 c의 번지를 기억시키는 방법이다.

p = &c

&
연산자는 메모리의 변수나 배열에만 사용할 수 있고, 문자이나 상수 등에는 사용할 수 없다.
*연산자는 그 포인터가 가리키고 있는 변수나 배열변수의 값을 알려준다.

#include <stdio.h>
/* pointer test */
main()
{
  int x = 1, y = 2, z[10];
  int *ip;  // 정수형 데이터의 포인터 선언

  ip = &x;
  printf( "ip= %d\n", ip );  // x의 메모리 주소 할당
  y = *ip;
  printf( "y= %d\n", y );  // *ip 와 x 는 같다.
  *ip = 0;
  printf( "*ip= %d\n", *ip );  // *ip 와 x 는 같다.
  ip = &z[0];
  printf( "ip= %d\n", ip );  // z[0]의 메모리 주소 할당
}
// output
ip= -1345986788
y= 1
*ip= 0
ip= -1345986828

C에서 호출할 때 매개변수는 그 값만 전달되므로(call by value) 호출된 함수에서 호출한 함수의 변수값을 바꾸는 것은 불가능하다. 이를 가능하게 하는 것이 포인터이다.

swap(&a, &b);

void swap( int *px, int *py ) {
  int temp;

  temp = *px;
  *px = *py;
  *py = temp;
}

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Basic Function

Programming/C 2006. 10. 4. 01:48
C 프로그램은 일반적으로 작은 여러 개의 함수들이 모여서 이루어진 구조로 되어 있다.
return문은 호출된 함수로부터 계산된 값들을 호출한 함수로 넘겨주는데 사용되며, return문 뒤에는 어떤 수식이나 다 쓰일 수 있다.

리턴형 함수이름 (매개변수 선언)
{
  선언문과 다른 문장들
}

* 문자열내 패턴찾기 프로그램
#include <stdio.h>
#define MAXLINE 1000

int getline( char line[], int max );
int strindex( char source[], char searchfor[] );

char pattern[] = "ould";  // 검색할 패턴

main() {
  char line[MAXLINE];

  int found = 0;
  while ( getline( line, MAXLINE ) > 0)
    if ( strindex( line, pattern ) >= 0 ) {
      printf( "%s", line );
      found++;
    }
  return found;
}

int getline( char s[], int lim ) {
  int c, i;

  i = 0;
  // 1000자를 넘지 않고, EOF를 만나지 않고, 개행문자가 입력되지 않는 동안
  while ( --lim > 0 && ( c = getchar() ) != EOF && c != '\n' )
    s[i++] = c;
  if ( c == '\n')
    s[i++] = c;
  s[i] = '\0';

  // 총 문자 길이 반환
  return i
}

int strindex( char s[], char t[] ) {
  int i, j, k;
  // 총 문자의 끝까지 루프

  for ( i = 0; s[i] != '\0'; i++ ) {
    // 패턴의 끝이 아니고, 입력된 문자와 패턴이 같을 때까지 루프
    for ( j = i, k = 0; t[k] != '\0' && s[j] == t[k]; j++, k++ )
      ;
    if ( k > 0 && t[k] == '\0' )
      return i;
  }
  return -1;
}

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

제어흐름

Programming/C 2006. 10. 4. 00:43
문장과 블록

x = 0, i++, printf() 같은 것은 수식(expression)이라 하며, 이들이 세미콜론(;)으로 끝나면 문장(statement)이 된다.
중괄호{}는 여러 개의 선언문이나 문장을 모아서 복합문이나 블록을 구성한다.
중괄호로 묶인 복합문은 구문상으로 단일문장과 동일한 기능을 수행한다.
블록의 끝을 나타내는 오른쪽 중괄호 뒤에는 세미콜론이 올 수 없다.


if-else문

수식값이 참이면 문장1을 수행하고, 거짓이면 문장2를 수행한다.

if ( expression )
  statement1
else
  statement2


else-if문

수식값이 참이면 바로 밑 문장을 수행하고, 거짓이면 다음 수식으로 넘어가는 과정을 반복한다.

if ( expression )
  statement
else if ( expression )
  statement
else if ( expression )
  statement
else if ( expression )
  statement
else
  statement


Switch문

switch ( expression ) {
  case constant : statement
  case constant : statement
  default: statement
}

switch문에서 상수나 상수 수식은 정수값을 가져야 한다.
default는 만족되는 것이 없을 때 수행되며, 생략해도 무방하다.
break문은 switch문에서 벗어나는 역할을 수행한다.


순환문 - While, For

while ( expression )
  statement

다음 for와 while의 구조는 같다.
for ( expression1; expression2; expression3 )
  statement
expression1;

while ( expression2 ) {
  statement
  expression3;
}


Do-While 루프

종료 조건을 루프 마지막에서 검사한다.
do-while 문장내의 프로그램은 최소한 1번은 수행된다.

do
  statement
while ( expression );


Break와 Continue

Break는 for문, while문, do문에서 루프를 벗어나는 역할을 한다.
중첩된 루프일 경우 한번에 가장 가까운 루프 하나를 벗어난다.
continue문은 for, while 또는 do 루프에서 다음 반복을 수행하기 위해 사용된다.
while문이나 do문의 비교부분이 다시 수행됨을 의미한다.
for문에서는 다음 단계로 제어흐름을 넘김을 의미한다.

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,
선언문

변수는 지역변수가 아니면, 초기화는 프로그램이 실행을 시작하기 전 단 한번만 실행되며, 그 초기화는 상수의 수식이어야만 한다.
초기화 되어지는 지역변수는 각 함수나 블록에 처음 들어갈 때 행해진다.
외부(external)와 정적변수(static)는 따로 지정하지 않으면 0으로 초기화된다.
변수의 값이 변하는 것을 방지하기 위해 한정사 const가 선언문에 적용된다.

const double e = 2.71828182845905;
const char msg[] = "warning: ";


산술연산자

산술연산자는 +, -, *, / 와 나머지 연산자 %이다.
% 연산자는 float나 double에는 적용될 수 없다.


형변환

변환은 지정문에서 나타나는데, 오른편은 왼편과 같은 형으로 변환되어, 그것이 결과 형이 된다.
캐스트(cast)라 불리는 단일 연산자를 써서 어떤 수식이든 강제로 형변환이 가능하다.

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

상수

Programming/C 2006. 9. 25. 21:24
상수

정수형 상수 1234 같은 것은 int이다.
long상수는 123456789L 처럼 L이나 l로 끝난다.
무부호형 상수는 u 또는 U로 끝나고, 접미사 ul 또는 UL은 unsigned long을 의미한다.
부동 소수형 상수는 소수점(123.4)이나 지수(1e-2)를 가지고, 접미사가 없을 경우에는 배정도(double)로 간주된다.
접미사 f 또는 F는 부동상수를 나타내며, l이나 L은 double을 나타낸다.

정수값은 0이 앞에 나오면 8진수, 0x 또는 0X가 앞에 나오면 16진수를 나타낸다.
8진수나 16진수 상수에도 L이나 U를 붙여 long 이나 unsigned로 만들 수 있다.
문자 상수는 'x' 같이 ''안의 하나의 문자로 나타내며 ACSII 문자집합에서 정수값을 갖는다.
문자상수는 다른 정수처럼 숫자 연산이 가능하며 보통 다른 문자와 비교하는데 쓰인다.

어떤 문자는 \n 처럼 escape 문자에 의해 문자나 문자열로 표현될 수 있다.
임의의 크기를 갖는 비트 패턴(bit pattern)은 한 개에서 세 개까지의 8진수를 써서 '\000'으로 나타낼 수도 있고, 하나 내지 두 개의 16진수를 써서 '\xhh'로 쓸 수도 있다.

#defind VTAB '\013'  /* ASCII vertical tab */
#defind BELL '\007'  /* ASCII bell */

#defind VTAB '\xb'  /* ASCII vertical tab */
#defind BELL '\x7'  /* ASCII bell */

* Escape Sequence
  • \a : 벨소리
  • \b : backspace
  • \f : formfeed
  • \n : newline
  • \r : carrage return
  • \t : 수평 tab
  • \v : 수직 tab
  • \0 : 0, null문자
  • \\ : backslash
  • \? : 물음표
  • \' : 작은따옴표
  • \" : 큰따옴표
  • \000 : 8진수
  • \xhh : 16진수
상수 수식(constant expression)은 상수만을 포함하는 수식이다.
이들은 실행시가 아닌 컴파일시에 값이 정해진다.

#define MAXLINE 1000
char line[MAXLINE + 1]:

#define LEAP 1
int days[31+28+LEAP+31+30+31+30+31+31+30+31+30+31];

문자열 상수(string constant)은 문자열에 따옴표를 붙여서 사용한다.
따옴표는 문자열에 포함되지 않고 다만 그것을 구분하기 위하여 쓰인다.

"I am a string"
"" /* the empty string */

문자열은 문자의 배열이다.
내부적으로 표현할 때는 문자열 끝에 '\0'을 가지고 있어서 실제로 기억장소는 따옴표 안에 있는 개수보다 한 개가 더 필요하다.
표준 라이브러리 함수인 strlen(s)는 끝의 '\0'를 뺀 문자열 길이를 리턴한다.

/* strlen: return length of s */
int strlen( char s[] )
{
  int i;

  i = 0;
  while ( s[i] != '\0' )
   ++i;
  return i;
}

문자상수와 하나의 문자를 갖는 문자열은 확실히 구분되어야 한다. 즉, 'x'는 x라는 문자를 나타내는 정수이고, "x"는 문자의 배열로 하나의 문자 x와 '\0'로 이루어져 있다.

열거(enumeration) 상수는 정수형 상수의 나열이다.

enum boolean { NO, YES };

값이 지정되지 않으면 집합안의 첫 번째 이름의 값은 0, 1, 2 등의 값을 차례로 갖는다.
값이 지정되지 않은 것은 앞의 것보다 1 큰 값을 갖게 된다.

enum escapes { BELL = '\a', BACKSPACE = '\b', TAB = '\t', NEWLINE = '\n', VTAB = 'v', RETURN = '\r' };
enum months { JAN = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC };

enum을 사용하면 #define보다 편리하게 여러 개의 상수를 지정할 수 있다.
컴파일러는 열거형 변수가 맞게 사용되었는지 확인하지 않는다.
열거형 변수의 값을 확인하기 위해서는 디버거(debugger)를 사용해야 한다.

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,