strcmp 실습
strcat 실습
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;
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); //끝낸다.
}