새소식

카테고리 없음

C언어 - 캐스팅 (데이터 타입, 자료형 변환) , 포인터 변환 , 구조체 포인터

  • -

 

* 자료형 변환

 

자료형의 크기

char -> short -> int -> long -> long long -> float -> double -> long double

  • (오른쪽으로 갈수록 자료형의 범위가 크다)
  • 형 확장 : 크기가 작은 자료형 -> 큰 자료형으로 변환할때. (ex : char -> int)
  • 형 축소(타입 캐스팅) : 크기가 큰 자료형 -> 작은 자료형으로 변환할때. (ex : float -> int)

 

 

 

1. 자료형이 같거나 크기가 큰 쪽으로의 변환 (형 확장)

C에서 long long 자료형은 int보다 크다.(표현 범위가 넓다) 따라서 이러한 경우에는 자동으로 변환된다.

int num1 = 100;
long long num3;

num3 = num1; // int를 long long에 넣어도 자동으로 변환되므로 컴파일 에러가 없다.

 

2. 자료형이 작은 쪽으로의 변환 (형 축소)

float를 int에 넣게되면 자료형이 작은쪽으로의 변환이므로 컴파일 경고가 발생된다.

float num1 = 13.563f;
int num2 = num1;
>>>> warning (4244 : .......)

정수형으로 변환 될 때, 소수점 부분의 값 손실이 있으므로 컴파일 에러가 발생된다.

따라서 형 축소를 하는 경우에는, 캐스팅(명시적 자료형 변환)이 필요하다. 값은 자료형을 소괄호 안에 넣어주고 뒤에 변수나 값을 붙여주면 된다.

  • (자료형)변수
  • (자료형)값
#include <stdio.h>
int main(void)
{
	int num = 82;
    float num2;
    num2 = (float)num;
}

 

 

 

* 포인터 변환

포인터도 마찬가지로 괄호에 자료형을 넣어주면 되지만 포인터를 나타내는  * (애스터리스크)도 필요하다.

  • (자료형 *)포인터
int 형 포인터 char 포인터로 변환하기
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int *numPtr = malloc(sizeof(int));
	char *charPtr;
    
    *numPtr = 5;
    
    charPtr = (char *)numPtr;
    
    printf("%d", *charPtr);
    free(numPtr);
}

 

# void 포인터는 자료형이 없으므로 역참조를 하기 위해서는 다른 자료형으로 캐스팅을 해야만 한다.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int *numPtr = malloc(sizeof(int));
	void *ptr;

	*numPtr = 9;
	*(int *)ptr = *numPtr;

	printf("%d\n",*(int *)ptr);
    free(numPtr);
}

 

* 구조체 포인터

#include <stdio.h>
#include <stdlib.h>

struct Da
{
	char c1;
    int num1;
};
int main(void)
{
	struct Da *d1 = malloc(sizeof(struct Da));
    void *ptr;
    
    d1->c1 = 'b';
    d1->num1 = 9;
    ptr = d1;
    
    printf("%c\n%d\n", ((struct Da *)ptr)->c1 , ((struct Da *)ptr)->num1);
    free(d1);
}

구조체 포인터를 void형 포인터에 넣을때는 컴파일 경고가 없지만, 멤버에 접근할때는 컴파일 에러가 발생한다.

따라서 멤버에 접근하여 값을 출력하거나 하는 경우에는 캐스팅을 해줘야한다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.