자료구조 스터디 유튜브 박동규 교수님의 널널한 박교수의 C프로그래밍 고급편으로 스터디 진행함 Show (인프런에도 강의가 있다 ㅎㅎ) 구조체구조체를 공부하기 위해 C에서 쓰는 자료형들을 먼저 한번 구조를 살펴본다. C의 자료형구조체란?구조체의 정의 : 기본 자료형만으로 표현하지 못하는 복잡한 형
struct라는 키워드를 이용하여 선언한다. #include <stdio.h> // 구조체 정의 // Person은 struct 태그(식별하기 위한 이름) struct Person { // Person 구조체 선언 char name[100]; // 구조체 멤버-이름 int age; // 구조체 멤버-나이 int height; // 구조체 멤버-키 float weight; // 구조체 멤버-몸무게 }; struct Person personA, personB; // 선언 이런식으로 struct 안에 필요한 것들을 정의해준다. 구조체 초기화변수 초기화와 마찬가지로, 구조체도 초기화가 가능하다.
struct Person personC = {"Park", 40, 174, 66}; printf("personC의 이름 %s, 나이 = %d\n", personC.name, personC.age); 구조체의 활용
예제코드 #include <stdio.h> struct point { int x; int y; }; struct rect { struct point p1; struct point p2; }; int main(void) { struct rect r; int w, h, area, peri; printf("왼쪽 상단의 좌표를 입력하시오: "); scanf("%d %d", &r.p1.x, &r.p1.y); printf("오른쪽 하단의 좌표를 입력하시오: "); scanf("%d %d", &r.p2.x, &r.p2.y); w = r.p2.x - r.p1.x; h = r.p2.y - r.p1.y; area = w * h; peri = 2 * w + 2 * h; printf("사각형의 면적은 %d이고 둘레는 %d입니다.\n", area, peri); struct rect new_r; new_r = r; // OK // struct rect rx = r * new_r; // if( r < new_r ) // 비교연산은 지원하지 않는다 // { // printf("new_r이 큽니다 \n"); // } // struct rect array_r[10]; // 구조체 배열은 가능함 return 0; } typedef 자료형typedef 자료형은 C에서 자료형을 새롭게 정의 하는데에 굉장히 유용하다. typedef의 이용typedef unsigned char BYTE; BYTE idx; // unsigned int index; 랑 똑같음 typedef int INT32; typedef unsigned int UNIT32; INT32 i; // int i;와 같다. UNIT32 k; // unsigned int k;와 같다. 위에서 배운 구조체랑 섞으면 typedef struct Person { // Person 구조체 선언 char name[100]; // 구조체 멤버-이름 int age; // 구조체 멤버-나이 int height; // 구조체 멤버-키 float weight; // 구조체 멤버-몸무게 } Person ; struct Point2D { // Point2D 구조체 정의 int x; int y; }; typedef struct Point2D Point2D; 같은 내용인데, 위와 같이 간단하게 쓸 수도 있다. 주로 어떨때 쓰면 좋냐면, #include <stdio.h> typedef struct point { int x; int y; } POINT; POINT translate(POINT p, POINT delta); int main(void) { POINT p = { 2, 3 }; POINT delta = { 10, 10 }; POINT result; result = translate(p, delta); printf("새로운 점의 좌표는(%d, %d)입니다.\n", result.x, result.y); return 0; } POINT translate(POINT p, POINT delta) { POINT new_p; new_p.x = p.x + delta.x; new_p.y = p.y + delta.y; return new_p; } 여기서 POINT translate 함수는, typedef를 통해 POINT형을 정의하여 사용한다. 이 함수를 좀 더 설명하자면, 매개변수를 이용해서 새로운 POINT 값을 만들어서 반환한다. 결과적으로는 delta 만큼 이동됨. typedef 자료형의 필요성
포인터포인터 변수
변수형의 크기
#include <stdio.h> int main(void) { int i; char ch; short shrt; float flt; double dbl; printf("int형의 크기 = %lu \n", sizeof(int)); printf("변수 i의 크기 = %lu \n", sizeof(i)); printf("변수 ch의 크기 = %lu \n", sizeof(ch)); printf("변수 shrt의 크기 = %lu \n", sizeof(shrt)); printf("변수 flt의 크기 = %lu \n", sizeof(flt)); printf("변수 dbl의 크기 = %lu \n", sizeof(dbl)); } sizeof 는 byte 단위이다. 주소연산자 &
포인터의 선언#include <stdio.h> int main(int argc, const char * argv[]) { int *myPointer; int myVar = 10; printf("myVar = %d\n", myVar); myPointer = &myVar; // myPointer 라는 변수는 myVar라는 변수의 주소값을 가진다. return 0; } myVar과 myPointer를 그림으로 나타내면 다음과 같다. 간접 참조 연산자 *포인터 변수가 가리키는 값을 가져오는 연산자다. 아까 main 함수에 다음과 같은 코드를 추가한다. *myPointer = 20; printf("\n*myPointer = 20으로 변경 \n"); printf("myVar = %d\n", myVar);
NULL 값
#include <stdio.h> int main(void) { printf("NULL value = %p\n", NULL); return 0; } NULL value 는 0x0으로 나온다. |