Canvas of Bliss

#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++' 카테고리의 다른 글

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

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band