c언어

· c언어
다차원 배열을 학습하기 전에, 배열에 종류에 대해 간단히 살펴보고 넘어가겠습니다. 배열의 종류 static 배열 index의 최대 범위가 compile시에 결정되는 배열로써, 메모리도 compile시에 할당됩니다. C언어의 전역 배열 변수 int arr[] = {1,2,3} 등이 포함됩니다. Fixed Dynamic 배열 index의 최대 범위가 compile시에 결정되지만, 메모리는 실행 중 함수가 호출될 때 할당되는 배열입니다. C의 지역 배열 변수의 경우 Stack에 할당됩니다. (예: int arr[10];) 그러나 자바의 경우에는 Heap 영역에 할당됩니다. (Non - Fixed) Dynamic 배열 최대 index를 실행시키기 전에는 모릅니다. 메모리도 실행될 때 할당됩니다. 자바의 Arra..
· c언어
Const const는 기본적으로 값의 재할당을 방지하는 키워드로, 변수를 상수처럼 사용할 수 있게 해줍니다. 그러나 Const를 포인터 변수에 사용하는 경우, 사용되는 위치에 따라 의미가 달라지는데 확인해 보도록 하겠습니다. 우선 Const를 포인터에 사용할 시, 다음과 같이 두 위치에 사용이 가능합니다. int num = 20; const int * ptr1 = # 혹은 int const * ptr1 = # int * const ptr2 = # 상수에 대한 포인터 - Const int * ptr 자료형 앞에 Const가 오는 경우 이때의 의미는 다음과 같습니다. ptr을 통해 꺼내온 값은 변경될 수 없습니다. 또는 ptr이 꺼내온 값은 상수(변경될 수 없는 수)입니다. 주의할 점..
· c언어
Call By Value 함수가 호출될 때, 인자로 변수를 전달하게 됩니다. 이때 변수 자체가 전달되는 것이 아닌 값만 복사가 됩니다. Call By Value의 특성 Call By Value를 사용하게 되면, 서로 다른 두 함수간의 독립성이 보장됩니다. 즉, 디버깅이나 유지보수, 재사용에 유리합니다. 그렇지만 Call By Value로는 인자로 전달된 값 자체를 바꿀 수 없다는 단점이 있습니다. 따라서 이를 해결하기 위해 주소를 전달하는 방식을 사용할 수 있습니다. #include void noSwap(int a, int b); void swap(int * a, int * b); int main(){ int a =10; int b =20; printf("before noSwap : (%d, %d)\n"..
· c언어
C언어의 꽃,,,? 이라고 할 수 있는 포인터에 대해 공부해 보도록 하겠습니다. 메모리 (주기억장치) 프로그램 도중에 값을 저장해 두었다가 추후에 읽을 수 있게 하는 장치입니다. 1byte(8bit)마다 주소가 세겨져 있습니다. 포인터 포인터는 메모리(주기억장치) 공간의 주소입니다. 주소는 결국 숫자지만, 이를 int 타입에 담아서는 안됩니다. 포인터 변수 포인터 변수는 메모리의 주소만 담는 변수입니다. 포인터 변수를 줄여서 포인터라고 부릅니다. (사실 포인터는 정확히 말해서는 '주소' 그 자체일 뿐이지만, 대부분 포인터 변수를 포인터라 부르기 때문에, 앞으로 등장하는 모든 포인터 변수를 포인터라 하겠습니다.) 포인터 변수의 타입은 *를 붙여서 표시합니다. ( 예: * ptr) 그러나 주소 값만 가지고는..
· c언어
C언어에서는 문자열을 표현하기 위해 char의 배열을 사용합니다. 문자열 큰 따옴표로 둘러싸여 있으면 문자열로 간주합니다. 중요한 것은 해당 문자열을 저장하는 배열의 마지막에는 컴파일러가 자동으로 널 문자('\0')[아스키 값 0]를 추가해줍니다. 따라서 원하는 문자열이 있다면, 해당 길이 + 1만큼의 배열 공간이 필요합니다. #include int main(){ char str[10] = "apple";//문자열 char str2[10] = {'a','p','p','l','e'};//문자열이 아님 char str3[10] = {'a','p','p','l','e', '\0'};//문자열 char str4[6] = "apple";//문자열 printf("%s\n", str); printf("%s\n", s..
· c언어
C언어에서 배열을 사용하는 방법에 대해서 알아보겠습니다. int grade[100]; int : 요소 타입 grade : 배열 명 [100] : 요소 개수 배열의 개수가 100개일 때, 배열의 인덱스는 0에서 99까지의 값을 가집니다.(즉 인덱스는 1이 아닌 0부터 시작합니다.) 배열 요소의 주소 C언어에서 배열은 연속된 메모리 공간에 존재합니다. 즉 요소끼리 서로 붙어 있으며, 따라서 int형 배열의 특정 인덱스번째 요소의 주소는 다음과 같이 구할 수 있습니다. &grade[i] = &grade[0] + sizeof(int) * i 배열의 초기화 배열을 초기화 하는 방법은 다음과 같습니다. #include int main(){ int grade1[4] = {1,2,3,4}; int grade2[ ] =..
· c언어
분할 정복 (Divide and Conquer) 분할 정복이란 커다란 문제를 작은 문제들로 쪼개어 작은 문제들을 해결하고, 그에 대한 결과로 커다란 문제를 해결하는 방법입니다. 이는 작은 문제와 큰 문제가 동일한 성격일 때 사용합니다. (흔히 아는 수학적 귀납법의 반대 순서입니다.) 재귀 함수 재귀함수는 자기 자신을 호출하는 함수입니다. base case 부분과 재귀 호출 부분으로 구성되어 있으며, 함수가 호출될 때 마다 새로운 스택 프레임이 생성되므로 지역 참조 환경이 달라집니다. #include long factorial(int n) { if(n == 1) return 1; // base case 부분 return n * factorial(n-1); // 재귀 호출 부분 } Base Case는 Deg..
· c언어
register register 키워드는 변수를 CPU 레지스터에 저장해 달라고 요구하는 키워드입니다. register는 메모리에 비해 접근 속도가 빠르기 때문에, 당연히 연산의 처리 속도가 증가합니다. 그러나 register의 크기는 메모리보다 훨씬 작기 때문에 모든 변수를 register에 할당할 수 없습니다. 컴파일러는 기본적으로 스스로 최적화를 진행한 후 register에 변수를 할당하지만, register 키워드를 사용할 경우 컴파일러에게 해당 변수를 register에 등록하면 좋다는 힌트의 용도로 사용할 수 있습니다. 힌트의 용도이므로 무조건 register에 등록되는 것은 아닙니다. 모든 레지스터가 사용중이면 할당 받지 못할수도 있습니다. volatile 다음은 자바의 volatile에 대한..
말 랑
'c언어' 카테고리의 글 목록 (2 Page)