c언어 복습 유도 확인학습 문제
문제 1 : const 키워드의 의미
다음 문장들을 대상으로 키워드 const가 갖는 의미를 설명한다.
const int num=10;
const int * ptr1=&val1;
int * const ptr2=&val2;
const int * const ptr3=&val3;
const는 변수를 상수화하기 위해 사용
const란 변수를 상수화하기 위해 쓴다.
상수는 반드시 선언과 동시에 값을 할당하여 초기화한다.
초기화 안하면 컴파일 에러 발생
const int n = 10; // n=12 x
데이터상수화, 상수포인터
n이라는 포인터가 아니라, 포인터가 가리키는 대상을 상수화한다.
n이라는 포인터를 이용해서 데이터를 변경하는 것을 막겠다.
(포인터 외에 변수를 변경하는 것은 막지 못함)
메모리공간은 그대로이다.
const int* n = 12;
// *n = 20 (x)
// a = 20 (0)
포인터상수화
int* const n = 12;
// n = &a (x)
데이터상수화 + 포인터상수화
const int* const n; // 데이터상수화, 포인터상수화 둘 다 불가
문제 2 : 실행중인 프로그램의 메모리 공간
실행중인 프로그램은 OS로부터 메모리 공간을 할당받고, 크게 데이터, 스택, 힙 영역으로 나뉜다. 각 영역에는 어떠한 변수가 할당되는지 설명하며 C언어의 malloc과 free 함수와 관련해서도 설명한다.
void function(int);
int main(void)
{
int size;
cin>>size;
function(size);
return 0;
}
void function(int i)
{
int array[i];
// stack에 올려야되는데 올리지 못한다
// 그래서 heap에 선언하기 위해
// malloc과 free 함수를 사용한다.
}
OS는 메모리공간의 효율적 관리를 위해 나눠서 메모리공간을 할당한다.
데이터영역?
전역변수, 스태틱변수가 들어간다.
전역/static 변수가 초기화 되는 시점만 다르고 생성되는 시점은 같다.
전역 변수 : 프로그램이 실행되자마자 할당되어 프로그램 종료 시까지 남아있다.
static 변수 : 프로그램 시작과 동시에 메모리공간에 할당되나, 호출 시 변수 초기화가 된다.
stack의 용도 및 특징?
컴파일 타임에 메모리의 크기가 결정될 수 있는 것들을 저장하기 위한 메모리 공간
heap의 용도 및 특징?
런타임에 메모리의 크기가 결정되는 변수나 배열과 같은 것들을 저장하기 위한 메모리 공간
프로그래머가 관리 (할당, 해지)
malloc & free 함수의 필요성?
malloc은 heap에 메모리공간을 할당 / free 함수 호출로 반드시 할당된 걸 해지 (미호출 시 미해제)
사용할 줄도 알아야 한다.
// C
#include <stdlib.h> //malloc 함수가 포함된 헤더 파일
void* malloc(size_t size)
// size_t : 동적으로 할당할 메모리의 크기
// 반환값 : 성공 시 할당 메모리의 첫번재 주소, 실패 시 null
#include <stdio.h>
#include <stdlib.h>
void main()
{
int* arr;
arr = (int*)malloc(sizeof(int) * 4); // size 4 동적할당
arr[0] = 100;
arr[1] = 200;
arr[2] = 300;
arr[3] = 400;
for (int i = 0; i < 4; i++) {
printf("arr[%d] : %d\n", i, arr[i]);
}
free(arr); //동적할당 해제
}
문제 3 : Call-by-value vs. Call-by-reference
함수의 호출형태는 크게 값에 의한 호출과 참조에 의한 호출로 나뉜다. 이 둘을 나누는 기준이 무엇인지, 두 int형 변수의 값을 교환하는 Swap 함수를 예로 들어가며 설명한다.
call by value 함수 : 값에 의한 호출, 함수가 매개변수를 값으로 전달받음
call by reference 함수 : 함수의 매개변수를 참조변수로 선언하는 방식.
참조변수 기능이 추가되면서 C언어에는 없던 C++에서 추가된 개념.
// Call-by-value
void SwapByValue(int num1, int num2)
{
int temp = num1;
num1=num2;
num2=temp;
}
// Call-by-reference
void SwapByRef(int * ptr1, int * ptr2)
{
int temp = *ptr1;
*ptr1=*ptr2;
*ptr2=temp;
}
#include <iostream>
void plus(int &a) { // 참조 매개변수
a++;
}
int main() {
int a = 10;
plus(a); // Call by Value 처럼 사용
std::cout<<a<<std::endl;
return 0;
}
'C, C++ > 열혈 C++ 프로그래밍' 카테고리의 다른 글
02-3. 참조자(Reference)의 이해 (0) | 2021.09.13 |
---|---|
[윤성우 열혈 c++] OOP 단계별 프로젝트 01단계 (0) | 2021.08.19 |
01-5 이름공간 (0) | 2021.08.19 |
01-4 인라인 함수 (0) | 2021.08.18 |
01-3 매개변수의 디폴트 값 (0) | 2021.08.18 |