목록C언어 (8)
happy coding
linked list 를 어떻게 c언어로 구현하는지 배열(array)은 구현이 간단하고 빠르지만 크기가 고정되고 중간에 삽입과 삭제가 어렵다. 연결리스트는 각각의 원소가 포인터를 사용하여 다음 번째 원소의 위치를 가리킨다. 데이터를 저장할 공간이 필요할 때마다 동적으로 공간을 만들어서 쉽게 추가할 수 있지만,구현이 어렵고 오류가 나기 쉽고 포인터 연산을 많이 하기 때문에 느리다. 하지만 왜 쓰냐면, 배열의 단점을 완벽하게 커버하기 때문이다. 연결 리스트의 구조는 노드 = 데이터 필드 + 링크 필드 로 이루어져 있다. 여기서 첫 번째 노드를 가리키는 포인터를 헤드 포인터라고 한다. 자기 참조 구조체(self-referential structure)란 특별한 구조체로서 구성 멤버 중에 같은 타입의 구조체를 ..
연결리스트에서 사용됨 프로그램이 메모리를 할당받는 방법에는 정적(static)과 동적(dynamic)이 있다. 정적 메모리 할당이란 프로그램이 시작되기 전에 미리 정해진 크기의 메모리를 할당받는 것이다. 메모리의 크기는 프로그램이 시작하기 전에 결정된다. 단점은, 처음에 결정된 크기보다 더 큰 입력이 들어온다면 처리하지 못하고, 더 작은 입력이 들어온다면 남은 메모리 공간은 낭비된다. 동적 메모리란, 실행 도중에 동적으로 메모리를 할당받는 것을 말한다. 사용이 끝나면 시스템에 메모리를 반납해야 하며, 필요한 만큼만 할당받기에 메모리를 매우 효율적으로 사용할 수 있다. malloc()계열의 라이브러리 함수를 사용한다. int *p; p = (int*)malloc(sizeof(int)); void *mall..
이중 포인터(double pointer)란 포인터를 가리키는 포인터이다. 예를 들어 q는 포인터 p를 가리키는 이중 포인터인데 여기서 p는 int형 변수인 i를 가리키는 포인터이다. 여기서 **q 앞의 자료형은 q가 포인팅하는 변수의 타입이다. *(*q) = 200인 경우 뒤쪽에 있는 *연산을 먼저 하고, 괄호 밖의 *연산을 진행한다. 이중 포인터를 사용하는 이유는, 포인터 값을 인수를 통해 받아와야 할 때 포인터의 주소를 통해 받아와야 하기 때문에 사용한다. 여기서 p[1]이 dzf로 바뀌지 않는 이유는 운영체제 에서 막아놨기 때문에(?) > 위의 배열과 포인터를 구분할 줄 알아야 한다. 문자열 배열에서 가장 많이 사용되는 건 포인터 배열이며, 이는 문자열들을 효율적으로 저장할 수 있다. 포인터 배열(..
포인터(pointer)란 주소를 가지고 있는 변수를 의미한다. 이를 이용하여 메모리의 내용에 직접 접근할 수 있다. 변수는 메모리에 저장되고 메모리는 바이트 단위로 접근이 가능하다. 따라서 변수의 크기에 따라 차지하는 메모리 공간이 달라진다. 예를 들어 char형 변수는 1byte, int형 변수는 4byte. 여기서 변수의 주소를 계산하는 연산자는 &이다. 예시로, 변수 i의 주소는 &i 라고 말할 수 있다. int i = 10;// 정수형 변수 i 선언한다. int *p = &i;// 변수 i의 주소가 포인터 p로 대입된다. short birthday; short *ptr;//포인터가 가리키는 대상의 크기가 2바이트인 포인터 변수를 선언 ptr = &birthday;//birthday 변수의 주소를 ..
배열 배열이란 동일한 타입의 데이터가 여러 개 저장되어 있는 데이터 저장 장소를 의미한다. 배열 안에 있는 각각의 데이터들은 정수로 되어 있는 번호에 의해 접근이 가능하다. 배열을 이용하면, 여러 개의 값을 하나의 이름으로 처리할 수 있다. 여기서 배열 원소의 번호를 인덱스 라고 한다. 배열의 크기가 주어지지 않았을 때 자동적으로 초기값의 개수만큼이 배열의 크기로 잡힌다. 배열을 복사하려는 경우 단순히 "=" 으로 복사하면 컴파일 오류가 나기 때문에, for 문을 이용하여 복사해야 한다. int a[SIZE]; int b[SIZE]; b = a;//error for (i=0;i 1000 printf("%d\n", arr);//배열의 첫 번째 인자의 시작 주소를 의미 printf("%d\n", arr[0]..
자료형에는 char, int, float, double 등 기본자료형과 배열, 열거형, 구조체, 공용체 등 파생자료형으로 나눌 수 있는데 그 중 하나인 구조체에 대해 배워보았다. 구조체란 같은 자료형으로 이루어진 배열과 다르게 서로 다른 자료형을 하나로 묶는 구조를 말한다. struct 구조체_태그_이름 { 자료형 멤버_이름; 자료형 멤버_이름; ... }; 구조체를 정의하는 것은 붕어빵 틀을 정의하는 것과 같고, 붕어빵을 실제로 만드릭 위해서는 구조체 변수를 선언해야 한다. # 아직도 구조체랑 객체의 차이를 모르겠다 구조체 멤버를 참조하려면 . 을 이용한다. 구조체명.구조체멤버명 링크드리스트 또한 구조체 형식을 포인터로 엮어둔 것이다. 같은 구조체 변수끼리 대입은 가능하지만 비교는 불가능하다. 구조체를..
TCPschool을 보고 정리한 내용입니다. 변수(variable) 변수란 데이터를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간을 의미하는데, 다시 말해 데이터를 저장할 수 있는 메모리 공간이다. 그리고 이렇게 저장된 값은 변경이 가능하다. 또한, 데이터가 저장된 메모리의 주소를 저장하고 처리하는 포인터 변수가 있고, 관련된 정보를 한 번에 묶어 처리하는 사용자 정의 구조체 변수가 있다. 변수 정수형 변수 char, int, long 실수형 변수 float, double 변수의 이름 생성 규칙 1. 영문자(대소문자), 숫자, 언더스코어(_)로 구성된다. 2. 숫자로 시작될 수 없다. 3. 이름 사이에는 공백을 포함할 수 없다. 4. C언어에서 미리 정의된 키워드(keyword)는 사용할 수..
TCPschool을 보고 공부한 내용입니다. printf()함수 printf() 함수는 C언어의 표준 출력 함수이고 원형은 밑과 같다. printf에서의 f는 formatted의 약자이며, 서식화된 출력을 지원한다는 의미이다. 이 함수에서는 출력할 데이터를 어떤 서식에 맞춰 출력할지 서식 지정자를 통해 직접 지정이 가능하다. #include int printf(const char* restrict format, ...); printf("sentence.\n"); printf("%d개의 문장\n", 55); int형 데이터를 나타내기 위해 %d라는 서식 지정자를 사용하고, 줄바꿈은 \n이라는 이스케이프 시퀀스를 사용해 표현한다. 이스케이프 시퀀스(escape sequence) \' 작은 따옴표 \" 큰 따..