일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 분할 정복(Divide and Conquer)
- 백준 18352번
- 백준 10000번
- 백준 2812번
- BFS(Breadth First Search)
- 그래프(Graph)
- 백준 1707번
- 백준 1948번
- 백준 17608번
- 백준 21606번
- 동적 프로그래밍(Dynamic Programming)
- 위상 정렬(Topological Sort)
- 위상 정렬(Topology Sort)
- 이분 그래프(Bipartite Graph)
- 백준 9012번
- 플로이드 워셜 알고리즘(Floyd-Warshall Algorithm)
- 백준 2493번
- 그리디 알고리즘(Greedy Algorithm)
- 스택(Stack)
- 백준 2261번
- 백준 2504번
- DFS(Depth First Search)
- 다익스트라 알고리즘(Dijkstra Algorithm)
- 이분 탐색(Binary Search)
- DFS & BFS
- DFS
- 트리(Tree)
- BFS
- 큐(Queue)
- 알고리즘 개념
- Today
- Total
목록프로그래밍 언어/C (22)
Always Be Wise

C 언어에서 이미 Keyword로 사용하고 있어서 Identifier(ariables, functions, structures 등)로 사용할 수 없는 것들이 있다. ▶ 참고 링크 Rules for naming identifiers A valid identifier can have letters (both uppercase and lowercase letters), digits and underscores. The first letter of an identifier should be either a letter or an underscore. You cannot use keywords like int, while etc. as identifiers. There is no rule on how long a..

프로그램을 실행하면 운영체제는 프로그램이 사용할 메모리 영역을 할당한다. 할당하는 메모리 영역은 크게 데이터, 스택, 힙, 코드로 나뉜다. 프로그램이 실행될 때마다 영역을 할당하며, 할당 장소는 메인 메모리(RAM)이다. 데이터 영역 전역 변수와 정적 변수가 할당되는 영역으로 프로그램을 시작하면 할당하고, 프로그램을 종료하면 메모리에서 해제한다. 스택 영역 함수 호출시 생성되는 지역 변수와 매개변수가 저장되는 영역으로, 함수 호출이 완료되면 사라진다. 힙 영역 프로그램이 실행되는 동안 동적으로 생성되는 변수를 저장하기 위한 영역으로, 프로그램 실행 중 결정한다. 동적 메모리 할당시 사용하는 영역이다. 동적 메모리 할당 변수를 선언하는 대신 프로그램의 요청으로 메모리를 할당하는 것을 동적 메모리 할당이라고..
포인터는 어떤 변수의 주소를 담어서 가리키는 변수를 의미한다. 구조체 포인터도 크게 다르지 않다. 구조체를 가리키는 포인터를 구조체 포인터라고 한다. int *ptr 형식으로 int형 포인터를 선언하였듯이 구조체는 struct student *ptr과 같이 선언하면 된다. 아래 코드는 typedef를 사용해서 보다 간결히 구조체 포인터를 구현하였다. #include typedef struct { int s_id; int age; } Student; int main(){ Student goorm; Student *ptr; ptr = &goorm; (*ptr).s_id = 1004; (*ptr).age = 20; printf("goorm의 학번 : %d, 나이: %d\n", goorm.s_id, goorm..
일반 변수에 배열이 있듯이 구조체에도 배열이 있다. 구조체 배열을 선언하는 방법은 일반적인 배열을 선언하는 방법과 동일하다. 아래 코드에서 구조체도 문자열은 선언할 때만 초기화 할 수 있으므로 먼저 선언과 동시에 초기화를 해주고, 나머지 값들은 선언 후에 대입하였다. #include typedef struct { char name[30]; int age; } Student; int main(){ Student goorm[3] = { {.name = "해리 포터"}, {.name = "헤르미온느 그레인저"}, {.name = "론 위즐리"} }; goorm[0].age = 10; goorm[1].age = 10; goorm[2].age = 10; printf("이름 : %s / 나이 : %d\n", goo..
기본적으로 구조체를 선언할 때는 main 함수 밖에서 struct 구조체 이름 { 구조체 멤버들 }; 형태로 선언하고, main 함수에서 struct 구조체 이름 변수 이름 과 같이 선언한 후 사용한다. typedef를 이용하여 조금 더 편리하게 구조체 선언을 할 수 있다. typedef는 C 언어에서 자료형을 새롭게 이름을 붙일 때 쓰는 키워드이다. typedef를 이용하면 main 함수에서 구조체를 선언할 때 매번 struct를 써줄 필요가 없다. 이 typedef를 사용할 때에는 구조체 별칭이 필요한데, 구조체 별칭은 아래와 같이 구조체를 정의할 때 중괄호 뒤에 써주면 된다. #include typedef struct _Student { int age; char phone_number[14]; } ..
구조체란 하나 이상의 변수를 묶어서 좀 더 편리하게 사용할 수 있도록 도와주는 도구를 의미한다. 자료형이 다른 변수를 사용하기 위해서는 하나하나 선언할 필요가 있다. 그런데 똑같은 구조의 변수를 여러번 사용해야 하는 경우 이는 굉장히 비효율적이다. 구조체는 새로운 자료형을 만드는 것과 같다고 할 수 있기 때문에, 보통 main 함수 전에 선언한다. 어떤 함수 안에 선언하면 그 함수 안에서만 사용할 수 있기 때문에 만약 main 함수 안에 선언한다면 main 함수 안에서만 사용할 수 있다. 구조체의 기본적인 형태는 아래와 같다. struct 구조체 이름 { 구조체 멤버들 }; 이렇게 선언하는 것만으로는 구조체를 바로 사용할 수 없고, 아래와 같이 main 함수 안에서 따로 선언을 해주어야 한다. 선언 시에..
이중 포인터는 포인터의 주소 값을 담는 변수로, 포인터의 포인터라고 할 수 있다. 아래 코드에서 ptr에 num의 주소 값을 대입하고, pptr에는 ptr의 주소 값을 대입했다. 참조 연산자는 포인터가 가리키고 있는 변수의 값을 나타낸다. 이중 포인터는 그 포인터가 가리키고 있는 곳으로 가서, 또 그 포인터가 가리키는 주소로 찾아가서 그 변수의 값을 나타낸다. #include int main() { int num = 10; int *ptr; int **pptr; ptr = # pptr = &ptr; printf("num : %d, *ptr : %d, **ptr : %d\n", num, *ptr, **pptr); // num : 10, *ptr : 10, **ptr : 10 printf("num 주..
일반 변수에서 값을 절대 바꿀 수 없는 상수가 있듯이, 포인터에도 주소 값을 바꿀 수 없는 상수 포인터가 있다. const가 맨 앞에 오는 경우 const int *ptr과 같이 const를 가장 앞에 사용하게 되면, 이 포인터를 이용해 변수의 값을 변경하는 것을 막는다. 아래 코드에서 const로 선언하지 않은 ptr1은 *ptr1을 이용해 값 20을 변경할 수 있다. 하지만 const로 선언된 ptr2는 값 대입시 오류가 발생한다. 그렇지만 변수 num 자체가 상수인 것은 아니다. num = 30처럼 값을 변경하는 것은 가능하다. #include int main() { int num = 10; int *ptr1 = # const int *ptr2 = # *ptr1 = 20; num = ..
배열의 이름은 포인터 변수와 같은 기능을 하며, 첫번 째 요소의 주소값을 나타낸다. 아래와 같이 & 연산자를 사용하지 않아도 arr 이름 자체가 주소값이기 때문에, 바로 포인터에 대입이 가능하다. arr 이름은 배열의 첫번째 원소의 주소값이므로 arrPtr이 가리키고 있는 값을 출력해보면 첫번째 원소값인 10이 출력된다. #include int main() { int arr[5] = {10, 20, 30, 40, 50}; int *arrPtr = arr; // int *arrPtr = NULL; // arrPtr = &arr; int arr0Adress = &arr[0]; int arrAdress = &arr; printf("%d\n", *arrPtr); printf("%d\n", arr[0]); pri..
인자를 전달하는 방식은 크게 Call by value와 Call by reference로 구분된다. Call by value 기본적으로 C 언어에서 지원하는 방식은 Call by value이다. 함수에서 값을 복사해서 전달하는 방식으로, 인자로 전달되는 변수를 함수의 매개변수에 복사한다. 이렇게 복사되면 인자로 전달한 변수와는 별개의 변수가 되며, 매개변수를 변경해도 원래의 변수에는 영향을 미치지 않는다. 따라서 원본 값을 바꿀 필요가 없는 경우에는 Call by value 방식을 이용하면 된다. 아래 코드를 실행해보면 swap을 진행해도 매개변수가 바뀌는 것일뿐 원래 변수인 a, b의 값이 변하지는 않는다. #include void swap(int a, int b) { int temp; temp = a..