반응형
구조체 연산

구조체끼리의 연산은 불가능하다

하지만 멤버변수끼리의 연산은 가능합니다.

그리고 구조체끼리 할당은 가능합니다!

typedef struct
{
    int x;
    int y;
} Point;

int main()
{
    Point point1 = {3, 4};
    Point point2 = {1, 2};
    
    point1 + point2;		// 컴파일 에러
    point1.x + point2.x		// 컴파일 성공
    
    point1 = point2;		// 컴파일 성공
}

 

 

 

구조체 전달, 반환

아래의 코드처럼 구조체는 함수에서 매개변수로 전달이 될 수도, 반환형이 될 수 도 있습니다.

typedef struct
{
    char name[20];
    int age;
} Person;

void ModifyPerson(Person* person)
{
    person->age = 29;
}

Person CreatePerson()
{
    Person person;
    strcpy(person.name, "Oh_gun");
    person.age = 19;
    return person;
}

int main()
{
    Person person1 = CreatePerson();
    
    ModifyPerson(&person1);
}

 

 

 

구조체 초기화 방법

아래의 코드처럼 초기화할 수 있다.

typedef struct
{
    int x;
    int y;
} Point;

typedef sturct
{    
    Point center;
    double radius;
} Circle;

int main()
{
    Point point1 = { 3, 5 };
    Circle circle1 = { point1, 3.5 };		// x : 3, y : 5, radius : 3.5
    Circle circle2 = { {1}, 4.5 };		// x : 1, y : 0, radius : 4.5
    Circle circle3 = { 4, 5, 5.5 }; 		// x : 4, y : 5, radius : 5.5
}

 

 

반응형

 

반응형

'C' 카테고리의 다른 글

파일 입출력  (0) 2023.05.23
공용체(Union)  (0) 2023.05.23
구조체 변수 전달과 반환  (0) 2023.05.23
구조체 typedef 선언  (1) 2023.05.23
구조체  (0) 2023.05.22
반응형
함수에서의 구조체 변수 전달과 반환

아래의 코드 처럼 매개변수로 구조체 변수를 받을 수 있고,

반환 값으로 구조체 변수를 받을 수 있습니다.

void ShowPosition(Point pos)
{
    printf("[%d, %d] \n", pos.xPos, pos.yPos);
}

Point GetCurrentPosition(void)
{
    Point cen;
	scanf("%d %d", &cen.xPos, &cen.yPos);
    return cen;		// 구조체 변수 cen이 반환.
}

 

 

 

구조체 기반 Call-by-reference

C언어에서는 Call-by-reference는 없다.

하지만 기능은 비슷하기에 편의상 이 글에서는

Call-by-reference라 부르겠습니다.

typedef struct point
{
    int xPos;
    int yPos;
} Point;

void Swap(Point* ptr)
{
    prt -> xPos = (ptr -> xPos) * -1;
    ptr -> yPos = (ptr -> yPos) * -1;
}

int main(void)
{
    Point pos = {5, -5};
    Swap(&pos);		// xPos : -5 yPos : 5
    Swap(&pos);		// xPos : 5 yPos : -5
}

 

반응형

 

반응형

'C' 카테고리의 다른 글

공용체(Union)  (0) 2023.05.23
구조체 변수 연산, 초기화  (0) 2023.05.23
구조체 typedef 선언  (1) 2023.05.23
구조체  (0) 2023.05.22
문자열 관련 함수  (0) 2023.05.22
반응형
typedef 선언

아래의 코드처럼 typedef (자료형) (정의이름); 으로 선언되고

1번과 2번 코드는 똑같이 작동하고, 3번과 4번 코드도 똑같이 작동합니다.

typedef int INT;
INT num;	// 1
int num;	// 2

INT* ptr;	// 3
int* ptr;	// 4

 

 

 

구조체 typedef 선언

아래의 코드에서 1번은 구조체 point를 정의하고 struct point에 Point라는 이름으로 typedef선언을 한것이다.

2번은 구조체 point를 정의하면서 동시에 Point라는 이름으로 typedef선언 또한 동시에 한것입니다.

point는 생략가능합니다. 아래의 2번 코드처럼 사용하시면 됩니다!

// 1
struct point
{
    int xPos;
    int yPos;
 };
 typedef struct point Point;
 
 // 2
 typedef struct point	// point는 생략 가능
 {
     int xPos;
     int yPos;
 }Point;

 

 

 

구조체 typedef선언 하는 이유

구조체 변수를 사용할때 struct키워드를 항상 붙여줘야 했지만,

구조체에 typedef선언을 하면 struct키워드를 생략할 수 있습니다.

그렇기에 구조체에 typedef선언을 해주는 것입니다.

 

 

반응형

 

반응형

'C' 카테고리의 다른 글

구조체 변수 연산, 초기화  (0) 2023.05.23
구조체 변수 전달과 반환  (0) 2023.05.23
구조체  (0) 2023.05.22
문자열 관련 함수  (0) 2023.05.22
표준 입출력 버퍼  (0) 2023.05.22
반응형
new / delete 연산자

C++에서 new 및 delete 연산자는 동적으로 메모리를 할당하고 해제하는데 사용된다.

 

 

 

new 연산자
  • new 연산자는 힙(heap)에서 동적으로 메모리를 할당한다.
  • 할당하려는 메모리의 크기에 따라 적절한 양의 메모리를 힙으로부터 요청한다.
  • new 연산자는 할당된 메모리의 주소를 반환한다.

 

 

delete 연산자
  • delete 연산자는 new 연산자에 의해 할당된 메모리를 해제한다.
  • delete 연산자는 메모리를 해제하기 전에 해당 객체의 소멸자를 호출한다.
  • 메모리를 해제한 후에는 해당 메모리 영역에 접근할 수 없게 된다.

 

 

new / delete 연산자 장점

개발자가 직접 메모리를 동적으로 할당하고 해제함으로써

메모리 사용을 조절할 수 있는 장점을 제공한다.

 

 

 

주의사항
  • 메모리 누수 : 

메모리를 할당한 후에는 반드시 해당 메모리를 해제해야 한다.

그렇지 않으면 메모리 누수가 발생하여 사용 가능한 메모리가 줄어들게 된다.

 

  • 이중 해제 :

이미 해제된 메모리를 다시 해제하려고 하면,

프로그램이 비정상적으로 종료될 수 있다.

  • 배열과 delete[] : 

배열로 할당된 메모리는 new[] 로 할당하고 delete[] 로 해제한다.

new[] 를 사용한 경우 delete를 사용하면 예기치 않은 동작이 발생할 수 있다.

 

 

 

C++11부터는 new / delete 대신에 스마트 포인터(std::shared_ptr, std::unique_ptr)

와 컨테이너(std::vector, std::array)등을 사용하여 메모리 관리를 보다 안전하고 편리하게

할 수 있습니다.

 

 

반응형
반응형
반응형
구조체 배열의 선언과 접근

arr[0].xPos = 10; 와 같이 구조체 배열의 멤버변수에 접근할 수 있다.

struct point
{
    int xPos;
    int yPos;
}
struct point arr[4];	// 길이가 4인 구조체 배열 선언

 

 

 

구조체 배열의 초기화

아래의 코드와 같이 배열요소 각각의 초기화 값을 중괄호로 묶어 표현한다.

struct city arr[3] =
{
    {"서울", "강동"},	// 첫 번째 요소의 초기화
    {"인천", "서구"},	// 두 번째 요소의 초기화
    {"서울", "송파"}	// 세 번째 요소의 초기화
};

 

 

 

구조체 변수와 포인터

아래의 코드에서 포인터 변수는 1과 2번처럼 멤버 변수에 접근할 수 있다.

struct point pos = {11, 12};
struct point* pptr = &pos;	// 구조체 point의 포인터 변수 선언

// 구조체point의 포인터 변수의 멤버 변수 접근 방법
(*pptr).xPos = 10;	// 1
pptr -> xPos = 10;	// 2

 

아래의 코드처럼 사용 가능하며,

-> 연산자는 프로그래머들이 주로 사용하는 연산자이다.

(*pptr).xPos += 4;	// 멤버 변수 xPos에 4를 더한다
pptr -> xPos +=1;	// 멤버 변수 xPos에 1을 더한다.

 

포인터 변수를 구조체의 멤버로 선언할 수 있으며 

아래의 코드는 그 예제이다.

struct point
{
    int xPos;
    int yPos;
};
struct circle
{
    double radius;
    struct point* center;	// 구조체 변수의 멤버로 구조체 변수 선언
};

int main()
{
    struct point cen = {2, 7};
    double rad = 5.5;
    struct circle ring = {rad, &cen};
    printf("원의 반지름 : %g \n", ring.radius);	// 5.5 출력
    printf("원의 중심 [%d, %d] \n", (ring.center) -> xPos, (ring.center) -> yPos);	// [2, 7] 출력
    return 0;
}

 

 

구조체 변수 주소

구조체 변수의 주소 값과 구조체 변수의

첫 번째 멤버 변수의 주소 값은 같다.

 

반응형

 

반응형

+ Recent posts