6) C언어 기본기 정리
const
- const int num = 10 변수 num을 상수화
- const int * ptrl1 = &val1 포인터 ptrl1을 이용해서 val1 값 변경 불가
- int * const ptr2 = &val2 포인터 ptrl2가 상수화
- const int * const ptrl3 = &val3 포인터 ptrl3을 이용해서 val3 값 변경 불가하며 포인터값 싱수화
상수화된 변수
: const 선언에 의해서 만들어진 변수를 가리킴
본래 상수가 아니라, 변수를 상수화시킨 것으로 정의
ec. cons int &ref = 50;
main ()함수
int main(void) / int main(int argc, char* argv[])
argc : 프로그램에 전달할 인수 개수
argv : 전달한 인수의 값(실제 매개변수는 인덱스 1부터 시작하며 argv[0]에는 프로그램 이름이 담김)
메모리 공간
- stack = 지역변수 및 매개변수 저장 영역
- heap = malloc 함수호출에 의해 프로그램이 실행되는 과정에서 동적으로 할당이 이뤄지는 영역
호출된 함수를 free함수를 통해 해제해주어야 함
- data = 전역변수가 저장되는 영역
+ boo: true 와 false를 가리키는 자료 new+
7) 참조자
&의 사용
(1) 이미 선언된 변수 앞에 & 연산자 사용 시, 주소값의 반환을 의미
ec. int *ptrl = &num1 변수 num1의 주소 값을 반환에서 포인터 ptrl에 저장해라
(2) 새로 선언되는 변수의 이름 앞에 등장 시, 참조자의 선언을 의미 new+
ec. int &num2 = num1 변수 num1 에 대한 참조자 num2 선언
참조자
= 자신이 참조하는 변수를 대신할 수 있는 또 다른 이름(기능과 연산의 결과가 변수랑 동일함)
but 참조자는 선언과 동시에 변수를 대상으로만 선언가능
참조자는 별칭과 마찬가지의 쓰임이며, 참조자 수에 제한이 없고, 참조자를 대상으로 참조자 선언가능
레퍼런스의 레퍼런스, 레퍼런스의 배열, 레퍼런스의 포인터는 존재할 수 없음
-> 주소값이 존재한다는 것은 해당 원소가 메모리 상에서 존재를 의미, but 레퍼런스는 특별한 경우가 아닌 이상 메모리 상에서 공간을 차지하지 않음
+ 배열의 레퍼런스는 가능 ex. int arry[3] = {}; int (&ref)[3] = arry;
ex. int a, b, int& arry[2] = {a, b} 레퍼런스의 배열(불가능)
call by value VS call by reference
call by value : 값을 인자로 전달하는 함수의 호출방식 -> 함수 내부에서 외부에서 선언된 변수 접근 불가능
call by reference : 주소값을 인자로 전달받아, 함수 외부에서 선언된 변수에 접근하는 형태의 함수 호출
-> 주소값이 참조하는 영역에 저장된 값을 직접 변경함
+ 주소값대신 참조자를 사용하여 함수호출 시 전달되는 인자로 초기화 가능;
권고사항)
함수 내에서, 참조자를 통한 값의 변경을 진행하지 않을 경우, 참조자를 const로 선언해서, 함수의 형만 봐도 값의 변경이 이루어지지 않음을 알 수 있게 함
참조자 상수
: const 참조자를 이용해서 상수를 참조할 때 임시변수를 만듦.
이를 통해서 함수에 인자전달을 목적으로 변수 선언이 불필요함
ec. int ADDER(const int &ref1, const int &ref2); 선언 ADDER(3, 4) 호출
reference return 은 reference 참조하는 타입의 크기와 상관없이 딱 한 번의 주소값 복사로 전달(매우 효율적)
but Dangling reference 주의 (= 피참조값이 사라지는 현상)
-> 레퍼런스를 리턴하는 함수에서 지역 변수의 레퍼런스를 리턴하지 않도록 유의
함수에서 값 리턴 (int f()) | 함수에서 참조자 리턴 int&f() | |
값 타입으로 받은 경우 int a = f() | 갑이 복사됨 | 값이 복사됨, 다만 지역 변수의 레퍼런스를 리턴하지 않도록 주의 |
참조자 타입으로 받는 받음 int & a = f() | 컴파일 오류 | 가능. 다만 지역 변수의 레퍼런스를 리턴하지 않도록 주의 |
상수 참조자 타입으로 받는 경우 const int & a = f() |
가능 | 지역 변수의 레퍼렌스를 리턴하지 않도록 주의 |
8) 동적할당함수 new & delete
malloc(C언어) -> new(C++)
ec.
int * ptr1 = new int; int형 변수의 할당
double *ptr2 = new double; double형 변수의 할당
int * arr1 = new int[3] 길이가 3인 int형 배열의 할당
free(C언어) -> delete(C++)
ec.
delete ptr1; 앞서 할당한 int형 변수의 소멸
delete []arr1; 앞서 할당한 int형 배열의 소멸
힙에 할당된 변수는 포인터가 아닌 참조자를 통해 이용가능
9) C++에서 C언어의 표준함수
헤더파일의 확장자인 .h를 생략하고 앞에 c를 붙이면 C언어에 대응하는 C++헤더파일 이름이 됨
모든 표준함수들이 이름공간 std 내에 선언되어 있기 때문에 가능
ec.
#include <stdio.h> -> #include <cstdio>
#include <string.h> -> #include <cstring>
+) C++헤더를 선언해야 하는 이유 : 하위 버전과의 호환성을 제공하기 위해서
10) 변수
type | explanation | example |
(signed) int signed |
부호가 있는 정수를 표현, 값의 범위는 컴파일러마다 다름(일반적으로 4bytes) | int i { -7 }; signed int i { -6 }; signed i { - 5]; |
(signed) short (int) | 작은 범위의 정수(일반적으로 2bytes) | short s { 13 }; short int s {14 }; signed short s { 15 }; signed short int s { 16 }; |
(signed) long (int) | 큰 범위의 정수 (대부분 4bytes) | long l {-7L}; |
(signed) long long (int) | 아주 큰 범위의 정수(대부분 8bytes) | long long ll { 14LL }; |
unsigned (int) unsigned short (int) unsigned long (int) unsigned long long (int) |
앞에 나온 정수 타입의 범위를 => 0으로 제한 | |
float | 단정도 부동소수점수 | float f {7.2f}; |
double | 배정도 부동소수점수, 정밀도가 최소 flozt보다 큼 | double d {7.2}; |
long double | 확장 배정도 부동소수점수. 정밀도가 최소 double 보다 큼 | lond double d {16. 98L}; |
char unsigned char signed char |
단일 문자 | char ch {'m'}; |
char8_t(C++20부터) char16_t char32_t |
단일 n비트 UTF n인코딩을 적요한 유티코드 문자(n은 8, 16, 32 중 하나) | char8_t c8{u8'm'}; |
wchar_t | 단일 확장 문자. 구체적인 크기는 컴파일러마다 다름 | wchar_t w {L'm'} |
bool | 부울 타입으로 true 나 false 중 하나의 값을 가짐 | bool b {true}; |
* 위 예시들은 대입 문법이 아닌 균일 초기화, uniform initialization 문법에 따라 작성함
ex. bool b = true (대입 문법) / bool b {true} (균일 초기화 문법)
- 숫자 경계값(정수의 양의 최댓값)
C에서는 INT_MAX로 매크로 정의사용
C++에서는 위의 방법 + <limits> 에서 제공되는 std::numeric_limits 클래스 템플릿 사용
정수에서는 최솟값, minumum value와 최젓값 lowest value가 같으나
부동소수점수에서 최소값은 표현 가능한 가장 작은 양의 값, 최젓값은 표현 가능한 가장 작은 음수(-max())
- 영 초기화
유니폼 초기자, {0} 을 이용하여 0으로 초기화함, 0 생략 가능
빈 중괄호 {} 로 표기한 유니폼 초기자를 영 초기자라고 함
기본 정수 타입 -> 0 / 기본 부동소수점 타입 -> 0.0 / 포인터 타입 -> nullptr
'프로그래밍 언어 > C++' 카테고리의 다른 글
문자열 클래스 (2) | 2024.03.12 |
---|---|
객체지향프로그래밍 (0) | 2024.03.06 |
전처리 지시사 (0) | 2024.02.25 |
rand, srand, time을 이용한 난수 생성 (0) | 2024.02.15 |
C++ 기본기(1) (1) | 2024.02.13 |