본문 바로가기

Programming/C++124

메모리 관리와 동적 할당 프로그램을 실행시키기 위해서 메모리 공간이 필요하다. 지역 변수나 전역 변수를 선언하기 위해서도 메모리 공간이 필요하다. 그래서 운영체제는 본인이 실행시킨 프로그램의 실행을 위해서 메모리 공간을 할당해 준다. 이렇게 해서 할당되는 메모리 공간은 크게 스택, 힙 그리고 데이터 영역으로 나뉘어 진다. 할당 시기는 프로그램이 실행될 때마다 이며, 할당 장소는 메인 메모리이다. (여기서 말하는 메인 모메리는 RAM을 의미함) 할당 용도는 프로그램 실행 시 필요한 메모리 공간의 할당을 위함이다. 데이터 영역은 전역 변수와 static 변수가 할당되는 영역이다. 이 영역에 할당되는 변수들은 일반적으로 프로그램의 시작과 동시에 할당되고, 프로그램이 종료되어야 메모리에서 소멸된다. 즉, 데이터 영역에 할당된 변수는 프.. 2017. 7. 24.
파일의 끝을 확인해용 파일의 끝을 확인하는 방법은 두 가지가 있습니다. 리턴 값을 참조하는 방법파일의 끝이라는 개념은 데이터를 파일에서부터 읽어 들일 떄 유용한 개념입니다. 그렇기 떄문에 파일로부터 데이터를 읽어들이는데 사용되는 함수(fgets, fgetc) 들은 파일의 끝에 도달하는 경우 정해진 값을 리턴합니다. fgetc - EOF(-1), fgets - NULL(0), fscaf - EOF(-1) #include int main(void){int state;char* pState;char str[20]; FILE * file = fopen("Test.txt", "rt"); while (1){pState = fgets(str, sizeof(str), file);if(pState == NULL)break;fputs(str,.. 2017. 7. 24.
FILE 구조체의 포인터 FILE 구조체의 포인터 이 함수는 전달된 인자를 참조해서 사용자가 요구하는 파일을 원하는 방식으로 개방시켜 주는 함수이다. 지정한 파일과의 데이터 입력, 출력을 위해 스트림을 생성하는 함수이다. 즉, 파일의 개방이나 스트림의 생성은 같은 의미를 지닌다는 뜻이다. 리텁 값은 무엇일까? 리턴 값은 FILE 이라는 구조체 변수의 포인터이다. 여기서 FILE 구조체가 어떻게 생겼는지 알 필요는 없다. 왜냐하면 FILE 구조체 변수의 멤버를 우리가 직접 조작하는 일은 없기 때문이다. 다만, FILE 구조체 변수가 어떠한 정보를 지니는지 정도만 알면 된다. 결론부터 이야기하면, FILE 구조체 변수는 개방한 파일에 대한 여러 가지 정보를 지니는 변수이다. 무슨 목적으로 사용하게 되는가? 데이터를 입력 출력 할때,.. 2017. 7. 24.
[c++] Reference, call #include using namespace std; void SwapByRef2(int &ref1, int &ref2){int temp = ref1;ref1 = ref2;ref2 = temp;} int main(void){int val1 = 10;int val2 = 20; SwapByRef2(val1, val2);cout 2017. 5. 14.
[c++] RefPtr #include using namespace std; int main(void){int num = 12;int *ptr = #int **dptr = &ptr; int &ref = num;int *(&pref) = ptr;int **(&dpref) = dptr; cout 2017. 5. 14.
[c] 포인터의 포인터 #include void pswap(int *p1, int*p2);int main(void){int A = 10, B = 20;int *pA, *pB; pA = &A, pB = &B; // Before callprintf("pA -> : %d\n", *pA);printf("pB -> : %d\n", *pB); pswap(pA, pB); // After callprintf("pA -> : %d\n", *pA);printf("pB -> : %d\n", *pB); return 0;} void pswap(int *p1, int *p2){int *temp;temp = p1;p1 = p2;p2 = temp;} 1. 모든 포인터 변수는 4바이트 메모리 공간2. 가리킨다라는 말과 주소값을 갖는다는 동의어이다 #incl.. 2017. 5. 14.
[c] Call By Value, Reference #include void swap(int a, int b);int main(void){int val1 = 10;int val2 = 20; swap(val1, val2);printf("val1: %d\n", val1);printf("val2: %d\n", val2);return 0;} void swap(int a, int b){int temp = a;a = b;b = temp;printf("a : %d\n", a);printf("b : %d\n", b);} 1. 단순하게 값만 복사하고 연결이 끊어지는 것을 의미한다. Reference 와 차이를 설명하기 위해2. Swap 함수에 대한 이해3. 이것 몇 번 째 작성인지는 모르겠다. 이제 마지막. #include void adder(int* pVal); int.. 2017. 5. 14.
[c] 함수의 인자로 배열 전달하기 #include void fct(int *arr2); int main(void){int arr1[2] = { 1,2 };fct(arr1);printf("%d\n", arr1[0]);return 0;} void fct(int *arr2){printf("%d\n", arr2[0]);arr2[0] = 3;} 1. 함수 오랜만에 본다..2. 어레이를 선언하고 초기화 했는데 함수에서는 포인터 형태의 매개변수를 사용하네?3. 배열 이름은 첫 번째 요소의 주소 값을 의미하는 상수 포인터이다...4. 그래서 fct 함수의 매개 변수 타입이 int 형 포인터이다. #include int ArrAdder(int* pArr, int n); int main(void){int arr[10] = {1,2,3,4,5,6,7,8,9.. 2017. 5. 14.
[c] 배열 요소로 포인터를 지니는 포인터 배열 #include int main(void){int a = 10, b = 20, c = 30;int* arr[3] = { &a, &b, &c }; printf("%d\n", *arr[0]);printf("%d\n", *arr[1]);printf("%d\n", *arr[2]); return 0;} 1. 배열 요소로 포인터를 넣을 수 있다.2. 포인터는 주소값을 저장하는 변수 이다. #include int main(void){char * arr[3] = {"Fervent-lecture","TCP/IP","I LOVE YOU"}; printf("%d \n", &arr[0]);printf("%d \n", &arr[1]);printf("%d \n", &arr[2]); printf("%s \n", arr[0]);pr.. 2017. 5. 14.
[c] String Pointer Array #include int main(void){char str1[5] = "abcd";char *str2 = "ABCD"; printf("%s \n", str1);printf("%s \n", str2); str1[0] = 'x';//str2[1] = 'x'; printf("%s \n", str1);printf("%s \n", str2);return 0;} 1. 어레이와 포인터로 문자열을 저장하고 변경하는 방법2. 어레이 문자열의 경우 변수이기에 변경가능하나, 포인터 문자열의 경우 한가지 요소를 변경하는 것은 불가능하다. 2017. 5. 14.