Untitled

strcmp 실습

Untitled

strcat 실습

Untitled

strcpy 실습

문자열 맨 끝까지 간 후
int len = 0;
while (*str1 != '\\0')
{
++str1;
++len;
}
--str1;
//찾아가면 됨
for (int i = len - 1; i >= 0; ++i)
{
if (*str1 == targetchr)
{
return str1;
}
--str1;
}
return NULL;

Untitled

Untitled

1. Type : 데이터를 해석하는 방법
2. Memory : 데이터를 저장하는 공간
3. Object : 데이터를 저장하는 영역 → Memory

int main()
{
	int a;
	a = 10; //왜 이게 되는 것일까? → 두 개의 연산자가 같기 때문이다.

	// 연산자는 피연산자를 동반한다.
	// a + b
	// a = b : 할당 연산자는 피연산자가 2개 필요하다.
	// 피연산자에 조건. → Type이 붙는다.
	// 모든 연산자는 피연산자의 조건(Type)이 있다.

	int* p; (Pointer 도 객체다! → 즉 내가 메모리를 사용하는 것)
	// p = 3.14; (double 형식의 값을 int * 값에 할당 할 수 없다고 뜬다.)
	p = &a; (둘다 int * 형식 이므로 가능하다.)

	a[b] == *(a + b);
	// 1. 왜 a + b는 주소 연산일까? → 피연산자의 타입 때문에 주소 연산이란 걸 알게 되었다.
	// → a의 타입은 pointer 이고, b의 타입은 int 이므로 주소 연산이 가능하다.
	// 2. (역참조)*연산자는 오직 pointer Type에만 적용할 수 있다. → (a + b)의 타입은 pointer
	// 3. 역참조한 값의 Type은? → pointer가 가리키고 있는 Type이다.

ex) 
int arr[5];
arr[2]; == *(arr + 2);
(arr + 2); 
// 배열 + 정수 → 포인터 + 정수 → 주소 연산
// → int* + int;
// → int*
// *(int*) → 의 Type은 int

(arr + 2 ); // arr(value) + sizeof(type) * int → pointer to int
						// &arr[0] + sizeof(int) * 2;
						// 0x1234 + 4 x 2 → 0x123c

int arr2[2][3];
*(*(arr2 + 2) + 3);
arr2 + 2; // arr2 : int(*)[3]; → pointer to array
					// 주소 연산이다.
					// &arr2[0] + sizeof(int(*)[3]) * 2;
					// 첫 번째 원소로부터 24byte 뒤에 있는 것을 참조한다.
					// arr2 + 2 : int(*)[3];
*(arr2 + 2); //int[3]
*(int*);
int;
arr[2][3];

//문자열 리터럴의 저장 위치 → 데이터 영역 → 수정 불가능한 영역

char* str1 = "Hello";
str1[2] = 'o'; → 오류가 난다.

char* str4[] = "Hello";
str4[3] = 'o'; → { H, e, l, l<값에 o가 저장 된다. → "Heloo"}

const char* str1 = "Hello";
const char* str2 = "World";
const char* str3 = "Metaverse";

const int* const* const** const p;
-------------------------------------------------------------------
static_cast
const_cast
reinterpret_cast
dynamic_cast

OOP / Template

constexpr

containers library, string, input/output, range library 알아야 함.
-------------------------------------------------------------------

int* p = 0x1234; // (void*)로 암시적 형변환이 일어나고 → (int*) 가 되어 할당이 되지 않는다.

// 추가적으로 공부하면 좋은 것 : 운영체제
}

열거형 : 연관 있는 기호 상수를 묶어서 다룰 수 있는 Type

> > 열거형은 기호상수를 관리하는데 사용한다.
enum MetaverseProgramming
{
	META_HEEYOUNG,
	META_DAHOON,
	META_SUYEON,
	META_DONGHYUN,
	META_JAEYEON,
	META_JAEHYEON,
	META_HYUNSOO,
	META_JIN,
	META_THE_DRUNKEN_JAESUNG,
	META_THE_QUEEN_KYUNJI,
	META_JAMMIN,
	META_YEONGHOON,
	META_THE_CUTE_SEOYEON,
	META_THE_GAL,
	META_THE_VIRUS,
	META_HYEMIN,
	META_JINHO_JINHO,
	META_THE_TOP_PROGRAMMER_JJA,
	META_THE_CELEB_SUJIN,
	META_THE_BABY_FACE_MINSUB,
	META_THE_SORRY_JAEHYEOK,
	META_CLASS_LEADER_DRAGON,
	META_THE_THE_LOSTARK,
	META_THE_SIGOL,
	META_THE_PENGUIN_WOOJIN,
	META_THE_HONG,
	META_LAWER_MINWOO,
	META_SCIENTIST_JIYOON,
	META_GAMEMASTER_HYUKJIN,
	META_CONAN_DOIL
};

int main(void)
{
	enum MetaProgramming student = META_THE_GAL;

	switch (student) //swtich 문에 많이 쓰인다.
	{
		case META_THE_GAL:
		puts("갈!");
		break;
	}

}

//구조체의 정의
// struct [identifier] { struct-declaration-list }
struct Student
{
	int Age;
	enum { A, B, O, AB } BloodType
	char Name[24];
struct Student* BestFriend; // 자신의 타입도 멤버로 사용할 수 있다.

}

패딩 : 구조체 크기는 일반적으로 멤버의 크기를 전부 더하면 된다..

struct
{
	char ch; // 1바이트 + 7바이트
	double d; // 8바이트
	float f; // 4바이트 + 4바이트
}

union Color
{
	struct
	{
		unsigned char R;
		unsigned char G;
		unsigned char B;
		unsigned char A;
	};
	unsigned int Value;
};
		_________________________
 →  |  R  |  G  |  B  |  A  |
	  -------------------------
int main(void)
{
	union Color
	{
		struct
		{
			unsigned char R;
			unsigned char G;
			unsigned char B;
			unsigned char A;
		};
		unsigned int Value;
	};
	union Color color;
	color.R = 0;
	color.G = 47;
	color.B = 167;
	color.A = 255;

	color.Value = 0xFFAB4700; ( 00 47 ab ff → 4byte 하나씩 나눠서 썼다.)
}

int main(void)
{
 struct { char ch; double d; float f;}; //} 뒤에 s; 하면 바로 객체를 같이 만들 수 있다.
 alignof(struct S);

 sizeof(struct{char ch; float d; float f;}); // // float d에 struct S 가 들어가면 안된다
	// 패딩은 멤버의 정렬 요건 중 가장 큰 값으로 맞추게 된다.
	// 네트워킹 할때는 패딩 byte를 다 없애고 보낸다.
	// 패딩을 줄이려면 크기가 작은 것 부터 큰 순서대로, 혹은 큰 것부터 작은 순서대로 정의 하면 가장 최소한의 패딩 바이트를 얻는다.
 → 멤버 정의 순서가 제일 중요하다.
	{char ch; float f; double d;} 이면  → (1 + 3(padding) + 4)=8 + 8 = 16byte

}

---

void main(void)
{
	return;
}

int sum(int a, int b)
{
	return a + b;
}
--

//가변인자 만들기
#include <stdio.h>
#include <stdarg.h>

// myprintf(3, 1, 2, 3) -> My Variadic Function : 1, 2, 3
// "My Variadic Function : ~ " 
void/*(반환타입)*/myprintf(int count/*int타입의 값을 하나 받는다).*/,.../*(가변인자)*/)
{
	va_list args;
	va_start(args, count);

	printf("My Varidic Function :");
	for (int i = 0; i < count; ++i)
	{
		int number = va_arg(args, int); //가변 인자로부터 int 타입의 데이터를 하나씩 가져온다. 
		printf(" %d,", number);
	}
va_end(args);
}

int main(void)
{
	myprintf(10 , 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
	puts("");
	myprintf(4, 10, 20, 30, 40);
}

myprintf / putchar

void myprintf(int count, ...)
{
	// char* == va_list
	// char의 크기는? 1바이트
	// byte*
	va_list args; // 가변 인자를 다룰 객체를 만든다.
	va_start(args, count); // 가변 인자의 시작 위치를 알려준다.

	&count + 1;
	printf("My Variadic Function :");
	for (int i = 0; i < count; ++i)
	{
		int number = va_arg(args, int); // 인자를 빼서 사용한다.	
		printf(" %d,", number);
	}
va_end(args); //끝낸다.

}

Untitled