C언어에서 가장 많이 사용하는 변수는 역시 int일 것이다. 당장 for문 쓰려고 해도 int형 변수를 선언해야 하니까.
기본적으로, int는 정수형 변수고 char는 문자형 변수를 나타내는 예약어이다.

다음과 같이 선언해서 쓴다.
int a;
char b;

이렇게 하면 a는 정수 1개를 저장하는 변수가 되고 b는 문자 1개를 저장하는 변수가 된다.
a=65;
b='A';

이렇게 사용할 수 있다.
그런데 이런것도 된다.

a='A';
b=65;

이게 되는 이유는 C언어에서 문자를 숫자로 변환해서 사용하기 때문이다. 이때 변환하는 규칙은 ASCII코드표에 다 써져 있다. (ASCII코드가 아닌 다른 코드를 쓸 수도 있지만, 대세는 ASCII이다.)
다음과 같이 하면, a는 66이 되고 b는 "B"가 된다.
a++;
b++;


물론 다음과 같은 것도 된다.
printf("%d\n", a);
printf("%c\n", (char)a);
printf("%c\n", b);
printf("%d\n", (int)b);

이렇게 하면 그 결과는
65
A
A
65

가 될 것이다.

int와 char는 공통적으로 (실제로는) 둘 다 정수 1개를 저장한다. 하지만 int로 선언한 경우와 char로 선언한 경우에는 그 해석이 달라지는데, char로 선언하면 그것을 문자 1개로 해석한다. int로 선언한 경우에는 그것을 정수로 해석한다. 그리고 char에 저장될 수 있는 내용은, 그것을 정수로 생각한다면 8비트 정수 1개만 가능하다. 하지만 int는 그 선언을 어떻게 하느냐에 따라 다 달라진다
int a; //기계 또는 컴파일러에서 제공하는 기본적인 정수형의 길이(대체로 16비트나 32비트)
short int a; //16비트(2바이트) 길이
long int a; //32비트(4바이트) 길이
long long int a; //64비트(8바이트) 길이. 이건 요새 64비트 컴퓨터가 늘어나면서 쓰게 되었다. 운영체제에 따라서 long long 대신 int64를 쓰는 것도 있다.

이렇듯 더 큰 숫자를 쓰기 위해서 길이를 여러가지로 지정할 수 있다.

char은 또 한가지 중요한 특징이 있는데, 웬만해서는 포인터형 변수 또는 배열 변수로 사용한다는 점이다. 만약 "snowall"이라는 문자열을 처리하기 위해서 7개의 변수가 필요하다고 할 때,
char a='s';
char b='n';
char c='o';
char d='w';
char e='a';
char f='l';
char g='l';

이런식으로 쓰는 프로그래머가 있을지도 모르겠지만, 아마 돈받고 일하는 프로그래머중에는 없을 것이다.
이렇게 쓰면 아주 많은 문제가 발생한다. 직접 문자열을 다루고 체험하면서 느낄 수도 있지만 그런 수고를 덜기 위해서 간단히 설명해 보자면, 저렇게 쓰면 귀찮다. (귀찮지 않다면... 뭐 굳이 저렇게 써도 상관 없지만, 혼자서 개발하는 프로그램에만 저렇게 쓰기를 바란다.) 그래서 다음과 같이 쓸 수 있다.
char a[8] = "snowall"

이렇게 쓰면 a[0]부터 a[7]까지 접근하여 snowall의 각각의 글자들을 다룰 수 있다.[각주:1] 물론 a라는 배열 변수를 이용하여 한번에 뭔가를 할 수도 있다.
하지만 이 경우에도 문제가 발생하는데, a에 저장하여야 할 문자열의 길이가 7글자가 아닌 경우이다. 이때는 다시 길이를 마음대로 바꿀 수 있는 포인터를 사용하여 선언하게 된다.
#include<string.h>
char *a;
a = malloc(sizeof(char)*8);
strcpy(a, "snowall");
free(a);

이와 같이 쓰면 코드는 좀 복잡하지만 문자열의 길이를 맘대로 바꿔가면서 사용할 수 있다.
  1. 글자가 7개인데 배열이 8칸인 이유는 숨어있는 1글자 때문에 그렇다. 그 숨어있는 1글자는 자습. [본문으로]
by snowall 2010. 9. 19. 10:26