#include <iostream>
using namespace std;
void main()
{
//char szDst[20] = "";
//char szSrc[20] = "Hello";
//szDst = szSrc; // 불가능
//szDst = "Hello"; // 불가능
// 문자열 상수
// 큰 따옴표 안에 작성된 문자열을 문자열 상수라 한다.
// 문자열 상수는 Data 영역에 등록이 된다.
// Data 영역에 등록이될 때는 배열의 형식으로 등록이 된다.
// 이후, 문자열이 작성된 구간에 Data 영역의 주소가 반환된다.
// 결국 szDst = "Hello"는 배열의 이름에 Data 영역의 주소를 대입해라 라는 의미가 된다.
//// 문자열 상수를 다루는 방법
//// 주소 값을 저장하여 다루면 된다.
//char* pBuff = "Hello";
//cout << pBuff << endl;
//// 문자열 상수의 원소 접근
//char* pBuff = "Hello";
//cout << pBuff[2] << endl;
//// 원소에 접근하여 값을 수정하려했더니 오류가 발생한다.
//// 이는 상수의 성질을 변경해라 라는 의미이기 때문이다!
//pBuff[2] = 'L';
//cout << pBuff << endl;
// 문자 배열과 문자열 상수의 차이점
// 문자 배열
// stack 영역의 주소를 출력한다.
// const가 에스크리터 뒤에 붙는 경우와 동일하다.
// 문자열 상수
// Data 영역의 주소를 출력한다.
// const가 에스크리터 앞에 붙는 경우와 동일하다.
// 문자 배열은 선언과 동시에 초기화를 진행해야만 한다.
// -> 이후에 하는 대입은 값 변경이 아닌 주소 값 대입이기 때문이다.
// 문자열 입력
// 문자열 입력은 문자 배열을 이용한다.
// 문자 배열에 값을 입력할 때는 버퍼라는 것을 이용한다.
}
#include <iostream>
using namespace std;
void main()
{
// 문자열 함수
// 문자를 복사, 비교 등 문자열을 다루는데 이용한다.
//// ##1. 문자열 복사
//// strcpy_s(##1 , ##2 , ##3 )
//
//// ##1 : 목적지의 시작 주소
//// -> 복사 받을 메모리의 시작 주소를 전달
//// ##2 : 얼마만큼 메모리 크기를 다룰 것인지 전달(byte 단위)
//// ##3 : 출발지의 시작 주소
//// -> 복사 할 메모리의 시작 주소를 전달
//char szDst[20] = "";
//char szSrc[20] = "Hello";
//strcpy_s(szDst, 20, szSrc);
//cout << "szDst: " << szDst << endl;
//cout << "szSrc: " << szSrc << endl;
//// ##2. 문자열 결합
//// strcat_s(##1 , ##2 , ##3)
//// ##1 : 목적지의 시작 주소
//// -> 문자열을 이어 붙일 메모리의 시작 주소를 전달
//// ##2 : 얼마만큼 메모리 크기를 다룰 것인지 전달(byte 단위)
//// ##3 : 출발지의 시작 주소
//char szDst[20] = "Hello";
//char szSrc[20] = "World";
//strcat_s(szDst, 20, szSrc);
//cout << "szDst: " << szDst << endl;
//cout << "szSrc: " << szSrc << endl;
//// ##3. 문자열 길이
//// strlen()
//// ()안에 문자열의 길이를 확인하고 싶은 시작 주소를 전달
//// 문자열의 길이를 게산하여 반환한다.
//// 단, NULL문자를 제외한 순수 문자열의 길을 반환한다!!
//char szDst[20] = "Hello";
//cout << "sizeof: " << sizeof(szDst) << endl; // 20
//cout << "strlen: " << strlen(szDst) << endl; // 5
// ##4. 문자열 비교
// strcmp()
// 문자열이 같을 경우 0을 반환, 문자열이 다를 경우 0이 아닌 값을 반환
char szDst[20] = "Hello";
char szSrc[10] = "Hello";
if (!strcmp(szDst, szSrc))
cout << "같다" << endl;
}
#include <iostream>
using namespace std;
typedef struct tagGrade
{
int iKor;
int iEng;
int iMath;
int iTotal;
float fAver;
}GRADE;
void main()
{
// 구조체
// 사용자 정의 자료형이다!
// -> 사용자가 디자인하는 자료형
// 사용자가 디자인한다고해서 크기와 읽는 방법을 설정하는 것이 아니다!!!
// 사용하던 자료형들을 모으고 모아 하나의 데이터 덩어리로 만들겠다!
// -> 데이터 집합, 데이터 덩어리
// 구조체의 형태
/*
struct 자료형이름
{
// 멤버 변수
자료형 변수
자료형 변수
자료형 변수
}
*/
// 구조체 정의
// 구조체 정의는 전역에서 진행한다.
//// 구조체 선언
//// 자료형 : struct tagGrade
//// 변수명 : tGrade
//struct tagGrade tGrade;
멤버 접근
.()//// .(dot) 연산자를 이용하면 멤버에 접근할 수 있다!
//struct tagGrade tGrade;
tGrade.iKor =10 ;
tGrade.iEng =20 ;
tGrade.iMath =30 ;
////// 구조체의 초기화
////// 배열의 초기화와 비슷한 형태를 가진다.
////struct tagGrade tGrade = {};
//struct tagGrade tGrade = { 10, 20, 30 };
tGrade.iTotal = tGrade.iKor + tGrade.iEng+tGrade.iMath;
tGrade.fAver = tGrade.iTotal / 3.f;
//// typedef
//// type(타입) define(정의하다)
//// -> 타입을 정의하다!!
//// 타입(자료형)에 별명을 부여하여 사용하겠다!
//// 시스템 환경이 변하여 자료형의 크기가 변할 경우 단순 타입만 바꾸어주면 문제를 해결할 수 있다.
//// 또는 자료형의 이름이 길어 작성하기 불편할 경우 짧게 줄여 사용할 수 있다!
///*
//typedef 자료형 별명
//*/
//typedef int _int;
//int iA = 10;
//_int iB = 20;
////struct tagGrade tGrade;
//GRADE tGrade;
//// C와 C++ 구조체의 차이점
//// C는 struct tagGrade 형식으로 자료형을 선언해야 한다.
//// C++ tagGrade 형식으로 자료형 선언이 가능하다!
//// -> C++의 struct 키워드에는 typedef이 정의되어 있다!!!
}
#include <iostream>
using namespace std;
typedef struct tagGrade
{
int iKor;
int iEng;
int iMath;
int iTotal;
float fAver;
}GRADE;
void main()
{
// 구조체의 포인터형
GRADE tGrade = {};
GRADE* pGrade = &tGrade;
// 포인터를 통한 멤버 접근
tGrade.iKor;
(*pGrade).iKor;
// 구조체 포인터의 멤버 접근 지정자
// (구조체의 주소) -> (구조체 멤버)
pGrade->iKor;
}
#include <iostream>
using namespace std;
typedef struct tagSize
{
char chSize;
int iSize;
double dSize;
float fSize;
}SIZE;
typedef struct tagSize1
{
char chSize;
int iSize;
double dSize;
SIZE tSize;
}SIZE1;
// 자기 자신을 멤버로 가지는 구조체
typedef struct tagNode
{
char chNode;
int iNode;
float fNode;
double dNode;
tagNode* pNode;
//// 구조체의 크기를 계산하기 위해 멤버 구조체를 펼쳐야한다!
//// 하지만 펼쳤더니 멤버로 또 구조체가 있는 형태가 반복되고 있다!
//// 그래서 구조체의 크기를 알 수 없는 상황이 발생하기 때문에 불가능하다!
//tagNode tNode;
//// 자기 자신을 멤버로 가질 경우에는 typedef으로 재정의한 이름이아닌 본래 이름을 사용해야한다!!
//NODE tNode;
}NODE;
void main()
{
//// 구조체의 크기
//// 단순 계산으로는 17bytes 의 크기가 나온다!
//// 하지만 sizeof를 이용할 경우 24bytes의 크기가 나왔다!!!
//// 구조체의 크기를 계산하는 방법으로는
//// ##1. 멤버들을 모두 펼친다.
//// ##2. 가장 크기가 큰 자료형을 기준으로 삼는다.
//// ##3. 기준 만큼 메모리를 할당한다!
//// ##4. 구조체의 멤버들을 선언한 순서대로 할당한 메모리에 채워 넣는다.
//// ##5. 이후 ##3.과 ##4.을 반복한다!
//cout << sizeof(SIZE) << endl;
//// 구조체의 멤버로 구조체를 가지는 경우
//// 멤버 구조체도 펼쳐서 멤버 변수들을 확인한다.
//// 모든 멤버 변수들 중 크기가 가장 큰 자료형을 기준으로 삼는다.
//// 구조체 크기를 계산하는 방법으로 각각의 구조체의 크기를 계산한다.
//// 이후, 합산한 결과가 최종 크기가 된다.
//cout << sizeof(SIZE1) << endl;
}
C++ 성적표 예제 (0) | 2020.10.08 |
---|---|
C++ 문자열 뒤집기 예제 (0) | 2020.10.08 |
C++ 배열 예제 (0) | 2020.10.08 |
C++ 배열 로또 (0) | 2020.10.08 |
C++ 배열, 2차원배열, 문자열배열, 3차원 배열 (0) | 2020.10.08 |