본문 바로가기

2학년

(28)
[C]사용자 지정타입(1) 구조체 사용자가 C언어에 있는 기본 타입을 조합함으로써 새롭게 정의한 사용자 정의 데이터 타입을 말한다. 예로 들어, 우리가 "회원가입"을 구현한다고 생각해보면, 회원 1명은 이름, 연락처, 생년월일, 등급, 나이, 포인트 등의 정보를 갖는다고 정의해보자. 그렇다면 회원 1명을 선언할 때마다 이에 대한 선언문을 일일이 다 추가해야한다. 똑같은 기능을 가진 코드를 계속 선언해주어야하기 때문에 상당히 비효율적으로 느껴진다. 이럴 때 "구조체 키워드" 를 통해 "user"라는 구조체 타입을 선언함으로써 해결할 수 있다. #include struct 원하는 이름 { 자료형 멤버변수1; 자료형 멤버변수2; ... }; struct 키워드를 사용한 후, 희망하는 식별자명을 기재하면 해당 자료형의 구성요소를 블록 내..
[C]배열(2) + 동적할당 포인터 배열 요소로 포인터 변수를 가지는 배열이다. 더보기 int num1 = 1, num2 = 2, num3 = 3; int* arr[3] = {&num1,&num2,&num3}; 배열 포인터 배열을 가리킬 수 있는 포인터이다. *사용 이유 : 2차원 이상의 배열을 가리킬 때 포인터를 통해 배열과 같은 인덱싱을 할 수 있기 때문이다. 즉, 포인터를 배열처럼 사용하기 위해 배열 포인터를 정의하여 사용한다. #include int main(void){ int arr[2][3] = { {1,2,3} , {4,5,6} }; int (*pArr)[3] = arr; printf("%d", arr[1][1]); //배열 이름으로 참조 printf("%d", pArr[1][1]); //배열 포인터로 참조 } //출력..
[C]배열(1) 배열 동일한 변수명으로 인덱스(순서)만 변경함으로써 관리되는 동일한 자료형을 갖는 메모리상 연속된 변수들의 집합 int num[4]; 위 명령문을 컴파일러가 읽게 되면, 컴파일러는 메모리상에서 int형의 사이즈(4byte)의 1칸씩 총 4개의 길이를 갖는 배열 num에 대해서 인지한다. ( == 16byte) 일차원 배열에서 배열의 길이는 생략할 수 있으나 반드시 선언과 동시에 초기화해주어야한다. 컴파일러는 이를 기준으로 컴파일 타임에 메모리의 크기를 확정한다. 배열 또한 일반적인 지역변수처럼 블록 안에서 선언되었다면 스택메모리에 할당되며 초기화하지 않을 시 쓰레기 값이 저장되어 있다. int num[4] = {1,2,3,4}; 인덱스는 0부터 시작하여, num[0] = 1 / num[1] = 2 / n..
[C]포인터(2) 이중포인터 포인터 변수를 가리키는 포인터를 의미한다. 참조 연산자(*)를 두 번 사용하여 선언한다. ex) int num = 10; int* ptr= &num int** pptr = &ptr; num = *ptr = **pptr void 포인터 일반적인 포인터 변수와는 달리 대상이 되는 데이터의 타입을 명시하지 않은 포인터. 따라서 변수, 함수, 포인터 등 어떠한 값도 가리킬 수 있지만, 포인터 연산이나 메모리 참조와 같은 작업은 할 수 없다. 즉, void포인터는 주소값을 저장하는 것 이외에는 아무것도 할 수 없는 포인터이다. 따라서 실제로 포인터 로써의 기능을 진행할 때엔 반드시 주소값을 저장해둔 변수의 자료형에 알맞게 캐스팅 해주어야한다. 포인터 변수의 크기 어떤 자료형의 포인터인지와 무관하게, 메..
[C]포인터(1) 포인터 변수와 메모리 주소 지역변수라고 가정할 때, char num=1; 라고 선언한다면, 컴파일 타임에 컴파일러가 이를 보고 메모리에 자료형 만큼의 크기를 미리 확보한다 즉, 메모리에 1 byte를 확보한 후 실제로 프로그램이 실행되어 이 선언 문을 만난 시점에서 시스템에 의해 변수의 주소(메모리주소)를 할당 받고 메모리 주소의 이름이 num이 된다. 그리고 대입 연산자에 의해 1이라는 값을 메모리에 이진수 비트형태로 저장한다. &연산자 &연산자는 주소연잔자이다. 변수명 앞에 붙이면 변수가 메모리상에 저장된 주소값을 반환해주는 단항 연산자이다. 포인터의 선언과 사용 포인터는 "변수의 주소" 를 가리킨다. (따라서 일반적으로 포인터변수의 선언은 포인터변수 = &(변수명)꼴) 로 나타내는 것이 자명하다) ..
[C] 제어문 조건문 if문의 구조 #include int main() { int age = 20; if(age > 19) { printf("adult"); } printf("조건문이 끝났습니다"); } 출력결과 == adult조건문이 끝났습니다 -if ~else문 구조 if (조건식) { 조건식의 결과가 참일 때 실행 } else { 조건식의 결과가 거짓일 때 실행 } -if ~ else if ~ else 문 if (조건식1) { 조건식1이 참일 때 실행 } else if (조건식2) { 조건식2가 참일 때 실행 } else { 조건식1, 조건식2 모두 거짓일 때 실행 } switch ~ case문 주어진 조건 값에 따라 프로그램이 명령을 수행하도록 하는 조건문 switch(val) { case 1 : 명령문 bre..
[C]변수와 연산자(4) 4. 비교연산자 ==, != , > , >= , , . 단항 연산자: ! ~ ++ -- - + * & sizeof 승제 연산자: * / % 가감 연산자: + - 시프트 연산자: > 비교 연산자: = 등가 연산자: == != 비트 연산자: & ^ | 논리 연산자: && 조건 연산자: ?: 대입 연산자: = += -= *= /= %= >>=
[C]변수와 연산자(3) 형 변환 서로 다른 자료형 데이터끼리 연산을 하면 데이터의 손실이 발생할 수 있기 때문에 형 변환을 이용한다. 형 변환은 연산에 국한해 서로 같은 자료형인 것 처럼 계산하는 것이다. ( 실제로는 이미 자료형만큼의 byte가 메모리상에 할당되어있기 때문에 변경하는 것은 굉장히 까다로운 일이라고 한다) 1. 묵시적 형 변환 컴파일러가 자동적으로 수행하는 형 변환으로, 데이터의 손실이 최소화되는 방향으로 이루어진다. char -> short -> int -> long -> float -> double -> long double 2.명시적 형 변환 타입 캐스트 연산자를 통해 프로그래머가 직접 형 변환을 시킨다. 변수나 값 앞에 (자료형)을 사용한다. 더보기 int a=4; int b=5; double d = (..