[2022.06.25] 자료구조 - C기본 기초 기본문법(자료형, 배열, 다차원배열)

REASON·2022년 6월 25일
0

자료구조

목록 보기
3/15
post-thumbnail

자료구조

자료구조 학습 전 기초 C언어 문법 익히기

#include <stdio.h>

void main(int arc, char **argv) {
	int size_char = sizeof(char);
	int size_int = sizeof(int);
	int size_short = sizeof(short);
	int size_long = sizeof(long);
	int size_float = sizeof(float);
	int size_double = sizeof(double);

	printf("char = %d \n", size_char);
	printf("int = %d \n", size_int);
	printf("short = %d \n", size_short);
	printf("long = %d \n", size_long);
	printf("float = %d \n", size_float);
	printf("double = %d \n", size_double);
}
// 결과
char = 1
int = 4
short = 2
long = 4
float = 4
double = 8

C의 단순 자료형

C에서 기본적으로 제공하는 자료형(Data Type)이다.
unsigned는 음수 값대신 0이상의 값만 사용하는 자료형이다.

정수 자료형

  • short(2바이트) : -32,768 ~ 32,767
  • int(4바이트) : -2,147,483,648 ~ 2,147,483,647
  • long(4바이트) : -2,147,483,648 ~ 2,147,483,647
  • unsigned short(2바이트) : 0 ~ 65,535
  • unsigned int(4바이트) : 0 ~ 4,294,967,295
  • unsigned long(4바이트) : 0 ~ 4,294,967,295

실수 자료형

  • float(4바이트) : -3.4E-38 ~ 3.4E+38
  • double(8바이트) : -1.7E-308 ~ 1.7E308

문자형

  • char(1바이트) : -128 ~ 127
  • unsigned char : 0 ~ 255

1차원 배열

배열은 같은 자료형의 데이터를 메모리 상에 연속적으로 저장하는 자료형이다.

int 배열 만들기

 int key[3];

자료형 변수이름 [원소의 개수]형태로 작성한다.

변수 초기화의 필요성

변수는 반드시 초기화를 해야한다.
Debug 빌드 환경에서는 컴파일러가 초기값을 0으로 세팅해주지만, 실제 배포 모드는 보통 Release를 사용하기 때문에 Release 빌드 환경을 사용하면 변수의 초기값이 없으므로 쓰레기 값이 채워진다.
알수없는 임의의 값이 있기 때문에 심각한 문제를 발생할 수 있으므로 모든 변수는 초기화를 해야한다.

1차원 배열 초기화와 값 설정

배열의 초기화 하는 방법은 2가지가 있다.

정수형 데이터 배열 초기화

배열 초기화 방법 1-1

int key[3] = { 3, 5, 7 };

초기값 리스트를 이용해서 초기화하는 방법이다.

배열 초기화 방법 1-2

int key[] = { 3, 5, 7 }

원소의 개수를 지정하지 않아도 초기값 개수를 통해 자동으로 크기가 설정되기도 한다.

배열 초기화 방법 2

int key[3] = {0, };
key[0] = 3;
key[1] = 5;
key[2] = 7;

방법2는 먼저 선언 후 별도의 값을 설정하는 방법이다.
초기값 리스트를 통해 초기화를 해주지 않더라도 반드시 값을 0으로 세팅해주는 것은 좋은 습관이 된다.

문자열 배열 초기화

문자열은 각각의 원소가 char 타입이므로 1byte 크기를 갖는다. 문자열의 경우 반드시 마지막에 \0(문자열이 끝났음을 의미)이 들어가기 때문에 문자 배열 길이는 문자 길이 +1이 된다.
종료 문자를 의미하는 NULL문자열(\0)을 넣어줘야 컴퓨터가 문자열의 끝을 파악할 수 있다. NULL문자열을 찾을 때까지

방법 1-1

char str[6] = "value";

방법1-2

char str[] = "value";
또는
char str[] = {'v', 'a', 'l', 'u', 'e'};

방법 2

char str[6] = {0, };
str[0] = 'v';
str[1] = 'a';
str[2] = 'l';
str[3] = 'u';
str[4] = 'e';

문자열을 일일이 하나씩 넣는 방법 말고 문자열의 값을 복사하는 방법으로 strcpy 함수가 있다.

#pragma warning(disable : 4996)
#include <stdio.h>
#include <string.h>

void main() {
	char arr[3] = "ab";
	int arr2[] = {0, };
	strcpy(arr2, arr);
	
	printf("%s", arr2);
}

1차원 배열 예제

void main() {
	int i = 0;
	int size = 0;
	int key1[3] = { 3, 5, 7 };
	int key2[3] = { 0, };
	char string1[] = "value";
	char string2[100] = { 0, };

	key2[0] = 2;
	key2[1] = 4;
	key2[2] = 6;


	size = sizeof(key1) / sizeof(int);
	printf("key1의 원소의 개수는 %d개입니다.\n", size);
	for (i = 0; i < size; i++) {
		printf("%d번째 요소는 %d\n", i, key1[i]);
	}

	printf("--------------------------------------------------\n");
	
	size = sizeof(key2) / sizeof(int);
	printf("key2의 원소의 개수는 %d개 입니다.\n", size);
	for (i = 0; i < size; i++) {
		printf("key2 배열의 %d번째 요소는 %d입니다. \n", i, key2[i]);
	}

	size = sizeof(string1) / sizeof(char);
	printf("string1의 원소 개수 %d \n", size);
	printf("string1의 값 :  %s \n", string1);

	strcpy(string2, "배열 값 복사하기");
	size = sizeof(string2) / sizeof(char);
	printf("string2의 원소 개수 %d \n", size);
	printf("string2의 값 : %s \n", string2);
}

char string1[] = "value";
size = sizeof(string1) / sizeof(char);
printf("string1의 원소 개수 %d \n", size);

string1의 원소값을 출력해보면 6개로 나타난다.
실제 value 문자의 길이는 5이지만 마지막 NULL 문자까지 포함했기 때문에 사이즈가 6이 된다.

char string2[100] = { 0, };
strcpy(string2, "배열 값 복사하기");
size = sizeof(string2) / sizeof(char);
printf("string2의 원소 개수 %d \n", size); // 100

strcpy 함수를 사용한 string2는 카피한 값이 배열의 길이 100보다 작기 때문에 나머지 값은 0으로 채워진다.

다차원 배열

다차원 배열은 배열의 원소가 배열 자료형인 배열을 의미한다.
예를 들어 2차원 배열의 각 원소는 1차원 배열이 된다.

2차원 배열 초기화하기

다차원 배열 초기화 방법 1-1

int values[2][3] = { {3, 5, 7}, {4, 6, 8} };

하나의 행들로 묶어서 적는 방법이 있다.

다차원 배열 초기화 방법 1-2

int values[2][3] = { 3, 5, 7, 4, 6, 8 };

마치 1차원 배열처럼 나열하는 방법도 있다.

다차원 배열 초기화 방법 2

int values[2][3] = { 0, };
values[0][0] = 3;
values[0][1] = 5;
values[0][2] = 7;
values[1][0] = 4;
values[1][1] = 6;
values[1][2] = 8;

선언을 먼저 한 후 원소 하나하나 추가해주는 방법도 있다.
초기값은 0으로 항상 초기화해주는 습관을 들이자.

3차원 이상의 다차원 배열

행이 열보다 우선한다.
예를 들어 다음과 같은 3차원 배열이 하나 있다고 가정하면

int multi_values[2][3][4] = { 0, };

[2]가 행이되고 [3][4]로 구성되는 2차원 배열이 된다.
[3][4]는 내부적으로 행이 된다. 3*4 2차원 배열이 된다.

3차원 배열

int multi_values[2][3][4] = { 0, };
int multi_values1[2][3][4] = {
	1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
    16, 17, 18, 19, 20, 21, 22, 23, 24
};

두개의 배열 선언은 동일하다.

3차원 배열 선언2

int multi_values3[2][3][4] = {
		{
			{1, 2, 3, 4},
			{5, 6, 7, 8},
			{9, 10, 11, 12}
		},
		{
			{13, 14, 15, 16},
			{17, 18, 19, 20},
			{21, 22, 23, 24}
		}
 };

[2][3][4]로 선언한 배열은 처음 2개의 행을 갖고
그 안에 3행 4열을 가지는 형태이다.

int multi_values[2][3][4] = { 0, };
multi_values[0][0][0] = 1;
multi_values[0][0][1] = 2;

// 생략

multi_values[1][2][3] = 24;

위 코드의 multi_values 3차원 배열에 원소를 하나씩 추가하는 방법이다.


참고 자료
[자료구조] #03 2장 - VISUAL STUDIO를 이용한 C프로그래밍
[자료구조] #04 2장 - C의 단순 자료형/배열

0개의 댓글