본문 바로가기

BackEnd/C

함수 포인터(Function Pointer) 1. 함수 포인터란? 함수를 가리킬 수 있는 포인터를 의미한다. 2. 함수의 이름이 제공하는 두 가지 • 정의된 함수의 호출 • 함수가 위치하고 있는 주소 값의 확인 함수도 실행이 되기 위해서는 컴파일이 완료된 형태로 메모리 공간에 저장이 되어야 한다. 바로 이 위치 의 주소 정보를 얻을 수 있다는 뜻이다. 1234567891011121314151617181920212223#include void FuncOne(void){ printf("FuncOne 함수가 호출되었다! \n");} void FuncTwo(void){ printf("FuncTwo 함수가 호출되었다! \n");} int main(void){ FuncOne(); FuncTwo(); printf("FuncOne의 주소 값: %#x \n", F..
main 함수로의 문자열 전달 1. main 함수의 새로운 유형 지금까지는 main 함수의 매개변수 형을 void로 선언하였다. 그러나 프로그램 실행 시 인자를 전달받을 수 있는 형태로 main 함수를 선언할 수 있으며, 실제로 인자를 전달하는 것도 가능하다. main함수의 매개변수에 char * argv[ ]가 선언되었는데 먼저 이를 알아보자 123456int main(int argc, char * argv[]){....return 0;} cs 2. char * argv[ ] 선언에 대한 복습 위와 같은 main 함수의 유형을 이해하기 위해서는 char * argv[ ] 선언이 의미하는 바를 이해해야한다. char * argv[ ] 대해서는 이미 살펴보았다. 아래 링크를 참고하자. https://cg-developer.tistory..
메모리 컨트롤 함수 배열 A에 저장된 값을 배열 B에 저장하기 위해서는 배열 요소 하나하나를 일일이 복사해야만 한다. 배열의 이름을 이용한 대입연산이 허용되지 않기 때문이다. 하지만 지금부터 소개하는 이 함수들을 활 용하면 배열에 저장된 데이터의 전부 또는 일부를 한방에 복사할 수 있다. 1. memmove - 언제나 사용가능 한 메모리 복사 함수 memmove는 memory와 move의 합성으로 만들어진 이름이다. 메모리에 저장된 데이터를 다른 영 역으로 복사하는 기능의 함수이다.(참고로 복사보다는 이동의 기능이 좀더 강조되었다) 1234#include void * memmove(void * dest, const void * src, size_t len);//매개변수 dest로 전달된 주소 값이 그대로 반환된다. Colo..
volatile 과 restict 1. volatile volatile 은 최적화를 수행하지 말라는 뜻이다. 1) 변수에 volatile 선언 volatile int num; 이렇게 변수 num을 volatile로 선언하면, 변수 num에 저장된 값은 순간적으로 다른 영역 으로부터 참조될 수 있으니 코드 최적학를 수행하면 안된다는 의미를 준다. 이와 같은 코드가 있다고 가정할 때 컴파일러는 변수 num에 저장된 값을 성능의 향상을 위해서 한 번에 60 증가시켜도 되겠다라고 생각할 수 있다. 1234567891011int num=20; // 전역변수 numint function(void){ AAA(10); // AAA 함수는 변수 num의 값을 변경 및 참조하지 않음 num+=10; BBB(20); // BBB 함수는 변수 num의 값을 ..
포인터의 const 선언 1. 한정자 - Type Qualifier 한정자는 ‘한정’과 ‘자’의 조합이다. 그리고 한정’은 ‘제한’의 의미를 지닌다. 즉 한정자는 제한을 걸 때에 사용되는 키워드이다. C 언어에서 제공하는 한정자는 다음과 같이 총 3가지이다. • const• volatile • restrict 2. 포인터의 const 선언 기존의 const는 변수를 상수화하는 용도로 사용이 되는데, 이번에는 포인터와의 관계를 보자 다음 포인터 선언을 보자. int num = 10; int * ptr = # 포인터 ptr의 선언에서 const가 들어갈 수 있는 위치는 다음과 같다. 위 그림에서 보여주듯이 포인터 선언 앞 부분에 const가 삽입될 수도 있고,포인터 변수의 이름 앞에 const가 삽입될 수도 있다. 물론 이 ..
메모리 공간의 동적 할당 1. 메모리 구조 복습- https://cg-developer.tistory.com/162 가상 메모리는 다음 크게 4가지 영역으로 나뉜다. - 코드영역: 실행할 프로그램의 바이너리 코드를 저장할 공간 - 데이터 영역: 프로그램이 종료될때까지 유지해야 할 데이터를 저장할 공간 - 스택 영역: 아주 잠깐 사용하고 삭제할 데이터의 저장 공간 - 힙 영역: 프로그래머가 원하는 방식으로 쓸 수 있는 공간, 일반적이지 않은 특성의 변수 선언이 목적이라면 힙영역 활용 2. 힙 영역의 필요성 전역변수는 데이터 영역에 할당이 되어 프로그램이 종료될 때가지 남아있는 변수이고, 지역변수는 스택에 할당이 되었다가 해당 변수를 선언한 함수가 종료되면 소멸이 되는 변수이다. 따라서 이 두 가지 특성의 변수로는 충족되지 않는 부..
자료형에 이름을 부여하는 typedef 키워드 1. typedef 키워드를 이용해서 자료형에 새이름을 부여 간단한 예제를 봐보자 1234567891011121314151617181920212223 #include typedef int INT;typedef INT * PINT; void SwapRef(PINT p1, PINT p2){ INT tmp=*p1; *p1=*p2; *p2=tmp;} int main(void){ INT val1=5; INT val2=7; printf("Swap 이전 [val1:%d, val2:%d] \n", val1, val2); SwapRef(&val1, &val2); printf("Swap 이후 [val1:%d, val2:%d] \n", val1, val2); return 0;}Colored by Color Scripterc..
Call-By-Value vs Call-By-Reference 포인터를 이용하면 함수내에서 외부에 있는 변수에 직접 접근이 가능하다. 123456789101112131415161718192021222324 #include void CallByVal(int num){ num++;} void CallByRef(int * ptr){ (*ptr)++;} int main(void){ int val=10; CallByVal(val); printf("CallByVal: %d \n", val); CallByRef(&val); printf("CallByRef: %d \n", val); return 0;}Colored by Color Scriptercs 12CallByVal: 10CallByRef: 11cs 3행에서 이 함수가 하는 일은 매개변수인 num에 저장된 값을 1증가시키는게..