'CS/알고리즘 및 자료구조' 카테고리의 글 목록 (2 Page)
본문 바로가기
728x90

CS/알고리즘 및 자료구조33

C언어 - 포인터 활용, call by value, call by reference 간단하게 설명하면 call by value는 변수의 값을 부르는 것이고 call by reference는 변수의 참고(주소)를 부르는 것이다. 사실상 C언어에서는 call by reference 보다는 call by address라고 보는 게 맞다. 공식적으로 C언어에서 call by reference를 지원하지 않는다. call by address를 통해 call by reference와 같이 사용할 수 있다. Call by value 함수의 매개변수에 인수의 실제 값을 복사한다. 이경우 함수 안에서 매개변수끼리 값이 변하기 때문에 실제 인수 값에 영향이 가지 않는다. 즉 Call by value 함수 내에서만 값이 변경되고 실제 인수 값은 변함이 없게 된다. 실제 값을 변경할 필요가 없는 경우에 사용.. 2020. 10. 16.
C언어 - 포인터 연산, 포인터와 배열의 관계 포인터 연산 예를 들어 포인터 변수 p에서 *p일 경우 주소가 가리키는 값을 표시하고 p일결우 주소 값을 가리킨다. 이점에 주의하여 연산을 해야 한다. *p += 1, *p++, (*p)++ 의 차이점을 알아보자! *p += 10 같은 경우는 쉽게 이해가 될 것이다. 큰 차이점을 보인 것은 (*p)++ 와 *p++이다. 연산자에서 우선순위가 있어서 나타나는 현상이다. 연산자의 우선순위를 따라 ++,--가 포인터 연산자보다 우선이다. 포인터 연산자는 우선순위 2위인 간접 참조*이다. 그래서 포인터보다 먼저 p의 값이 증가되어 주소 값이 증가된다. (int는 4 바이트 이므로 주소 값이 4가 증가된다.) ++,-- 연산자를 사용할 때 주의해야 한다. a = 0x7ffee993598c *a = 5 a++ = .. 2020. 8. 28.
C언어 - 포인터(Pointer) 변수의 메모리 주소, 값 메모리는 메모리의 값과 메모리의 주소와 같이 저장된다. 실행 결과를 보면 a의 값은 5로 나오고 &a는 a의 주소 값을 출력한다. 이때 주소는 고정된 값이 아니라 컴퓨터마다, 실행할 때마다 달라진다. *시스템에 따라 32비트 64비트에 따라 메모리의 범위도 달라진다. 포인터란 메모리의 주소값을 저장하기 위함이다. 메모리 값이 변수에 저장되듯 메모리의 주소는 포인터 변수에 저장된다. 포인터 변수 선언 선언 시 포인터 변수를 사용한다. 자료형* 변수명 - int* hi; 자료형 * 변수명 - int * hi; 자료형 *변수명 - int *hi; 세 가지 방식으로 선언 가능하다. 편한 방식으로 사용하면 된다. 포인터는 선언 시 반드시 먼저 초기화되어야 한다. 그렇지 않으면 의도하지 않.. 2020. 8. 21.
C언어 메모리 구조 [스택(Stack), 힙(Heap), 데이터(Data)영역] 코드(CODE) 영역 프로그래머가 작성한 소스코드가 들어있는 부분이다. 실행할 프로그램의 코드가 저자오디는 영역으로 텍스트(code) 영역 이라고도 부른다 CPU는 코드 영역의 코드를 하나씩 수행한다. 데이터(DATA) 영역 데이터 영역에는 전역 변수와 정적변수가 선언된다. 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다. 힙(HEAP) 영역 프로그래머가 메모리를 직접 관리해야하는 영역이다. 동적 메모리 할달을 이용해 사용자에 의해 메모리의 크기가 동적으로 할당되고 해지는 필수로 해야된다. 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다. 스텍 영역은 반대로 할당된다. (동적할당-iyk2h.tistory.com/81) 스택(STACK) 영역 지역 변수와 매개변.. 2020. 8. 14.
C언어 변수의 유효 범위 - 전역 변수, 지역 변수, 정적 변수, 레지스터 변수 C언어에서는 범위에 따라 변수의 접근에 제한이 있다. 변수의 종류에 따라 유효 범위, 초기화 유무, 선언 위치, 메모리 소멸 시기, 저장장소 등등 조금씩 차이가 있다. 전역 변수 함수 외에서 선언을 하고 프로그램 전체에서 유효하다. 전역 변수는 선언 시 초깃값이 0으로 초기화된다. 전역 변수는 프로그램이 종료 시 전역 변수의 메모리는 소멸된다. #include intlocal_variable; //전역변수 선언, 초기값 0 intmain() { printf("%d",local_variable); //local_variable 변수는 전역 변수이기 때문에 변수 사용 가능 return 0 ; } //결과값 0 지역 변수 함수(블럭) 내에서 선언을 하고 함수(블럭) 내에서만 유효하다. 블록이 종료되면 메모리는.. 2020. 8. 7.
C언어 - 조합 알고리즘 [nCr] 경우의 수 순열을 프로그래밍화 (나열, 카운팅) 조합이란? - 서로 다른 n개에서 순서를 고려하지 않고 r개를 선택하는 방법의 수 구현 방향 - n의 원소의 갯수가 늘어날 수록 for문의 중첩이 계속 늘어나야 한다. - for문으로 구현할 경우 중첩이 많아질경우 효율이 떨어지고 n과 r의 값이 변할때마다 코드를 수정해줘야한다. - 재귀함수를 사용해서 문제를 풀어보도록 하자. 코드 #include int arr[] = {1,2,3,4,5}; //전역 변수로 선언 int Copy[5]; //arr배열을 복사하기 위한 배열 void print_Comb(int count); void Combination(int n,int r,int c); void print_Comb(int count){ for(int i=0;i 2020. 7. 10.
C언어 - 순열 알고리즘 [nPr] 경우의 수 순열을 프로그래밍화 (나열, 카운팅) 순열이란? - 서로다른 n개에서 중복 없이 r개를 택하여 나열하는것을 순열이라 한다. nPr (Permutation) 구현 방향 - n의 원소의 갯수가 늘어날 수록 for문의 중첩이 계속 늘어나야 한다. - for문으로 구현할 경우 중첩이 많아질경우 효율이 떨어지고 n과 r의 값이 변할때마다 코드를 수정해줘야한다. - 재귀함수를 사용해서 문제를 풀어보도록 하자. 코드 #include int arr[] = {1,2,3,4}; //전역 변수로선언. 동적 할당이 효율적임 void swap(int *a, int *b ){ //값을 이동하기 위한 함수 int tmp; tmp = *a; *a = *b; *b = tmp; } void print_arr(int size).. 2020. 7. 3.
C언어 - malloc, free, sizeof 를 이용한 동적 할당 메모리를 할당할 때 malloc, calloc, realio 함수를 사용하여 메모리를 동적 할당한다. 동적 할당하는 이유는 메모리를 효율적으로 사용하기 위함이고 C언어 경우 메모리를 자동으로 관리를 해주지 않기 때문에 직접 관리해 메모리 누수를 예방 그리고 이미 할당된 메모리라도 언제든지 크기 조정할 수 있다. 하지만, 해제하지 않으면 누수가 발생하므로 꼭 명시적으로 메모리를 해제해야 한다. malloc 함수 ( memory allocate - 메모리 할당 함수) - 함수의 원형 //라이브러리 헤더파일 void *malloc (size_t size) //size_t 는 부호 없는 정수 //size 바이트의 메모리를 힙에서 할당하여 반환 int *i = (int*) malloc (sizeof(int)); .. 2020. 6. 26.
728x90