일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 백준 1707번
- 위상 정렬(Topological Sort)
- 백준 17608번
- 다익스트라 알고리즘(Dijkstra Algorithm)
- 이분 탐색(Binary Search)
- DFS
- BFS
- 동적 프로그래밍(Dynamic Programming)
- 분할 정복(Divide and Conquer)
- 백준 10000번
- 그리디 알고리즘(Greedy Algorithm)
- 백준 1948번
- 위상 정렬(Topology Sort)
- DFS(Depth First Search)
- 백준 2812번
- 백준 2504번
- DFS & BFS
- 스택(Stack)
- 백준 21606번
- 백준 2493번
- 플로이드 워셜 알고리즘(Floyd-Warshall Algorithm)
- BFS(Breadth First Search)
- 그래프(Graph)
- 큐(Queue)
- 백준 18352번
- 알고리즘 개념
- 백준 9012번
- 이분 그래프(Bipartite Graph)
- 백준 2261번
- 트리(Tree)
- Today
- Total
목록프로그래밍 언어 (27)
Always Be Wise
이중 포인터는 포인터의 주소 값을 담는 변수로, 포인터의 포인터라고 할 수 있다. 아래 코드에서 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..

포인터란 어떤 변수의 주소 값을 저장하는 변수를 의미한다. 포인터 변수를 선언할 때는 담고자 하는 자료형에 *(참조 연산자)를 붙여서 선언한다. 만약 int형 변수의 주소를 담고 싶으면 int *을, char형 변수의 주소를 담고 싶으면 char *을 사용하면 된다. 포인터 변수의 크기는 32비트 시스템이면 4비트, 64비트 시스템이면 8비트로 동일한 크기를 같는다. 그러나 포인트 연산을 할 때에는 그 주소로 찾아가 해당하는 자료형의 크기를 읽어 들여야 한다. #include int main() { int *p = NULL; // int* p == int * p 모두 같음 int num = 15; p = # printf("int 변수 num의 주소 : %d \n", &num); printf("포인..
함수란 특정한 기능을 따로 분리해놓은 것을 의미한다. 함수를 이용하면 코드의 유지보수 및 가독성, 재활용성이 높아진다. 함수의 기본적인 형태는 아래와 같다. 반환형과 전달받는 인자, 즉 매개 변수가 없는 경우도 있다. /* 기본적인 형태 [반환형] [함수명] (매개 변수) { [호출 시 작동될 함수 내부 코드] } */ #include void func1(void) { printf("반환할 필요도 없고, 인자도 받지 않는 void 함수입니다.\n"); } void func2(int num) { printf("받은 인자는 %d 입니다.\n", num); } float func3(int num) { printf("인자의 형과 반환형을 맞춰줄 필요는 없습니다.\n"); return 3.14 * num; } i..
조건문에는 if 문과 switch 문이 있다. if 문은 가장 기본적인 조건문으로 아래와 같이 if와 else if, else로 구성되며 특정 조건을 만족하면 해당 조건에 해당하는 내용을 실행하는 형태로 구성된다. #include int main() { int num; printf("아무 숫자나 입력해주세요. : "); scanf("%d", &num); if(0 < num) { printf("num은 양수입니다."); } else if(num < 0) { printf("num은 음수입니다."); } else { printf("num은 0입니다."); } return 0; } switch 문은 if 문과 마찬가지로 조건을 체크하고 그 케이스를 실행한다. 단, if 문처럼 관계식을 쓰지는 못하고 특정한 정수..

컴퓨터는 숫자를 글자에 대응시키는 방식으로 문자를 사용한다. 예를 들어, 알파벳 'a'는 숫자 97에 대응된다. 이런 식으로 문자 하나 하나를 숫자에 매칭시키고 표현하는 방식을 아스키 코드(ASCII CODE)라고 한다. 그런데 1바이트를 사용하는 경우, 숫자와 문자를 매칭 시킬 경우 최대 256개의 글자 밖에 표현을 못한다. 이런 제한을 극복하기 위해 유니코드(UNICODE)를 사용한다. 유니코드는 문자를 2바이트로 처리하여 기존의 256배, 65,536개의 글자를 표현할 수 있다. #include int main() { char ch[7] = { 'a', 'b', 'c', 'd', 0, 'e', 'f' }; printf("ch 는 %s", ch); return 0; } 여러 정수를 하나의 변수에 담고..

배열을 이용하면 하나의 변수에 여러 개의 값을 넣을 수 있다. int main() { int arr[5] = {1, 33 , 47, 102, 155}; return 0; } 위와 같이 변수 이름 뒤에 대괄호를 이용해서 배열을 초기화할 수 있다. 대괄호 안의 숫자는 배열의 크기를 나타낸다. 위의 경우 5개의 값이 들어갈 수 있다는 의미이다. 배열 각각의 값들에 접근하려면 값의 위치를 알아야 한다. 값의 위치는 인덱스로 알 수 있다. 인덱스는 0부터 시작하기 때문에 배열에서 가장 첫 번째 값의 인덱스는 0이다. #include int main() { int arr[5] = {1, 33 , 47, 102, 155}; printf("arr 배열의 첫 번째(=인덱스가 0) 값 : %d\n", arr[0]); pr..