공용체(Union Type)의 정의와 의미

<구조체와 Union address, value 확인>

#include <stdio.h>
#include <stdint.h>

typedef struct {
    int a;
    int b;
    char c;
} number;

typedef union {
    int a;
    int b;
    char c;
    char d;
} utemp;

int main()
{
    number num1;
    utemp utem;
    utem.a=4;
    utem.b=6;
    utem.c='a';
    utem.d='b';
    printf("\n[STRUCT]\n"); 
    printf("size=%d\n",sizeof(num1));
    printf("size=%p\n",&num1.a);
    printf("size=%p\n",&num1.b);
    printf("size=%p\n",&num1.c);
    printf("\n[UNION]\n"); 
    printf("size=%d\n",sizeof(utem));
    printf("size=%p\n",&utem.a);
    printf("size=%p\n",&utem.b);
    printf("size=%p\n",&utem.c);
    printf("size=%p\n\n",&utem.d);
}


<struct 안의 union 공용체 address, value 확인>

#include <stdio.h>
#include <stdint.h>

typedef struct {
        int a;
        int b;
        char c;
union {
        int d;
        int e;
        char f;
};
        int g;

} number;

int main()
{
        number num1;
        num1.a = 1;
        num1.b = 2;
        num1.d = 4;
        printf("\n[STRUCT]\n");
        printf("size=%d\n\n",sizeof(num1));
        printf("b=%p\n",&num1.b);
        printf("c=%p\n",&num1.c);
        printf("d=%p\n",&num1.d);
        printf("e=%p\n",&num1.e);
        printf("f=%p\n",&num1.f);
        printf("g=%p\n\n",&num1.g);

}

struct 안에 union 선언을 한 경우 union 구조체 자체가 한 개의 메모리를 할당 받아서 사용함을 알 수 있다.


정의방식의 차이 :

struct선언 or union 선언

메모리 공간 할당되는 방식과 접근 결과 차이

1. 

sizeof로 구조체와 공용체(union) 찍어보면 각각 12, 4 출력

2. 

구조체 변수 - 구성 멤버는 각각 메모리 할당, 하지만 그 구조체 내부의 변수 타입중 가장 큰 놈의 사이즈로 모두 할당해버림.

공용체 변수 - 각각 할당(X), 크기가 가장 큰 멤버의 변수 타입만 하나 할당되어 이를 공유

공용체의 멤버에 값을 한 번 대입하고, 두 번 대입하면 두 번째 값이 모든 값을 덮어씀


typedef union

{

int n1;

int n2;

double n3;

};

위의 코드처럼 선언하면 밑에 그림처럼 생성이 된다.


'언어 > C' 카테고리의 다른 글

파일 입출력 -1  (0) 2016.03.10
구조체 기초 (열거형 enum)  (0) 2016.03.10
escape sequence  (0) 2016.02.26
counting program  (0) 2016.02.18
Symbolic Constants  (0) 2016.02.16
Posted by 知彼知己百戰不殆
,

escape sequence

언어/C 2016. 2. 26. 10:59



'언어 > C' 카테고리의 다른 글

구조체 기초 (열거형 enum)  (0) 2016.03.10
구조체 기초 (union, struct의 차이)  (0) 2016.03.07
counting program  (0) 2016.02.18
Symbolic Constants  (0) 2016.02.16
구조체(structure) - 중급  (0) 2016.01.09
Posted by 知彼知己百戰不殆
,

counting program

언어/C 2016. 2. 18. 17:39

Counting Program


Source Code

#include <stdio.h>

int main() {

double nc;

for(nc=0;getchar()!=EOF;++nc)

;

printf("%.0f\n",nc);

}


if the input contains no characters, the while or for test fails on the very first call to get char, and the program produces zero. while and for is that they test at the top of the loop, before proceeding with the body. If there nothing to do, nothing is done. Even if that means never going through the loop body.


Source : The C Programming language

'언어 > C' 카테고리의 다른 글

구조체 기초 (union, struct의 차이)  (0) 2016.03.07
escape sequence  (0) 2016.02.26
Symbolic Constants  (0) 2016.02.16
구조체(structure) - 중급  (0) 2016.01.09
구조체(structure) - 기초  (0) 2016.01.08
Posted by 知彼知己百戰不殆
,

Symbolic Constants

언어/C 2016. 2. 16. 17:10

COMPOSITION

#define   name   replacement text


name : same form as a variable name. a sequence of letters and digits that begins with a letter. conventionally written in upper case(capital letter).


no semicolon at the end of a #define line


advantage : easy to change in a systematic way


source : The C programming language

Posted by 知彼知己百戰不殆
,


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct person
{
        char name[20];
        int age;
};
 
int main() {
        struct person blair;
        strcpy(blair.name, "blair");
        printf("구조체 blair의 이름:%s\n",blair.name);
}
 
cs

위 코드와

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct person
{
        char name[20];
        int age;
};
 
int main() {
        struct person blair={strcpy(blair.name, "blair")};
        printf("구조체 blair의 이름:%s\n",blair.name);
}
 
cs

차이점?


첫 번째 코드 : 구조체 변수를 선언해놓고 나중에 strcpy를 써서 문자열을 옮김

두 번째 코드 : 구조체 변수의 초기화

 => 구조체 배열의 초기화 과정에서는 strcpy 함수를 호출하지 않아도 됨


*참고*

구조체에 키보드로 부터 입력받을 때는 scanf같은 거 사용하면 됨








Posted by 知彼知己百戰不殆
,

구조체 : 하나 이상의 변수(포인터 변수와 배열 포함)를 묶어서 새로운 자료형을 정의하는 도구, 사용자가 새로운 자료형 정의 가능


구조체 변수의 선언

struct type_name val_name

구조체 변수 선언시 위처럼 struct선언을 추가해야 하며, 이어서 구조체 이름, 구조체 변수 이름을 선언해야 한다.


구조체 내부에 있는 변수 접근시

구조체 변수의 이름(val_name).구조체 멤버 이름



구조체 선언 방법

struct point      // 구조체 정의와 변수의 선언, 여기서 point는 int나 double처럼 자료형의 이름이 된다

{

   int xpos;

   int ypos;

} pos1, pos2, pos3;    이런 식으로 구조체를 정의함과 동시에 구조체 변수를 선언할 수도 있고


struct point     // 구조체의 정의, 여기서 point는 int나 double처럼 자료형의 이름이 된다

{

    int xpos;

    int ypos;

};

struct point pos1, pos2, pos3;   // 구조체 변수의 선언



구조체 배열

ex) struct point arr[3]; 이런 식으로 구조체 배열 선언

구조체 배열을 선언과 동시에 초기화 시 배열의 길이만큼 중괄호를 이용해서 초기화를 진행

ex) struct person arr[3]={

{"blair","290490"},{"Alice","39848"},{"Ryan","57839"} };



구조체 변수와 포인터

ex) struct point pos={11,12};

struct point * pptr = &pos; // 포인터 변수 pptr이 구조체 변수 pos를 가리킨다.

(*pptr).xpos = 10;  // pptr이 가리키는 구조체 변수의 멤버 xpos에 10 저장

(*pptr).ypos = 20;

(*pptr).xpos = 10 이 문장은 pptr -> xpos = 10; 이 문장과 동일하다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
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("Center Circle is [%d, %d]\n", (ring.center)->xpos, (ring.center)->ypos);
}
cs

위 코드에서 보면 circle 구조체 안에 구조체 포인터 center을 선언해놓고, 나중에 point형 구조체를 초기화 하면서 구조체의 주소값을 ring 구조체에 넘겨주었다. 즉, ring.center가 가리키는 값은 point형 구조체 cen이다.

*추가*  TYPE형 구조체 변수의 멤버로 TYPE형 포인터 변수를 둘 수 있다.


구조체 변수의 조소 값과 첫 번째 멤버의 주소 값

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
struct point
{
        int xpos;
        int ypos;
};
 
struct person {
        int name[1];
        int phoneNum[1];
        int age;
};
 
int main() {
        struct point pos={10,20};
        struct person man={1,1,21};
 
        printf("%p\n%p\n%p\n%p\n",&man, &man.name,&man.phoneNum,&man.age);
}
 
cs

 코드 결과값



그냥 우리가 익히 아는 주소값 개념 그대로 적용된다. 만약 int name[1]대신에 char name[20]이면 주소값이 20차이가 남



typedef 선언

typedef : 기존에 존재하는 자료형의 이름에 새 이름을 부여하는 것을 목적으로 하는 선언

ex) typedef unsigned int * PTR_UINT; // unsigned int형 pointer을 PTR_UINT로 선언


구조체 배열의 초기화

struct person arr[2]={ 

{"김개똥","1234-1234",24},{"홍길동","1234-4234",28}

};


구조체 포인터

struct point pos = {11, 12};

struct point *pptr = &pos;

(*pptr).xpos = 10;  or  pptr->xpos=10; (*연산과 . 연산을 -> 연산으로 대신)


typedef 선언

기존에 존재하는 자료형의 이름에 새 이름을 부여하는 것

ex) typedef int INT;     //int의 또 다른 이름 INT를 부여

typedef struct (point)<< 구조체 변수 이름인 point는 생략가능

{

int xpos;

int ypos;

} Point;

그리고 이렇게 되면 구조체 변수 이름인 point는 거의 쓰이지 않아서 생략이 가능하다. 다만 생략할 경우 struct point man; 이런 식으로 선언 못함


구조체도 call by reference가 가능하다.

typedef struct point

{

~~~~

} Point;

void OrgSymTrans(Point * ptr)

{

~~~~

}

int main() {

Point pos={7,-5};

OrgSymTrans(&pos);

}

Posted by 知彼知己百戰不殆
,

int atoi(const char * str);      문자열의 내용을 int형으로 변환

long atop(const, char * str);      문자열의 내용을 long형으로 변환

double atof(const char * str);      문자열의 내용을 double형으로 변환

Posted by 知彼知己百戰不殆
,

초보자들이 하는 실수:

char str1[]="123";

char str2[]="123";

if(str1==str2)

  printf("equal");

else

  printf("not equal");


이런 식의 문자열 비교는 배열 str1과 str2의 주소 값을 비교하는 것이다. 배열의 이름은 배열의 주소 값을 의미한다!


1
2
3
4
#include <string.h>
 
int strcmp(const char * s1, const char * s2);
int strncmp(const char * s1, const char * s2, size_t n);
cs

Tip~! 문자열 비교를 해보면 ABC와 ABD를 비교하고, printf를 찍어보면 C와 D의 아스키코드 차이값인 양수 1반환

ABC와 ABE를 비교해보면, 양수 2반환


strcmp("ABCD", "ABCDE"); 를 하면 널 문자도 비교 대상에 속하므로, E의 아스키코드 값이 널의 아스키 코드 0보다 크므로 음수가 반환된다.


Posted by 知彼知己百戰不殆
,
1
2
3
4
#include <string.h>
 
char * strcat(char * dest, const char * src);
char * strncat(char * dest, const char * src, size_t n);
cs

문자열을 뒤에 이어 붙일 때는 널문자가 입력된 그 부분부터 바로 문자열을 덧붙임

널 문자가 저장된 위치에서부터 복사가 진행되어야 덧붙임 이후에도 문자열의 끝에 하나의 널 문자만 존재하는 정상적인 문자열이 된다.

Posted by 知彼知己百戰不殆
,
1
2
3
4
#include <string.h>
 
char * strcpy(char * dest, const char * src);
char * strncpy(char * dest, const char * src, size_t n);
cs

strcpy는 널 값은 복사를 안하니까 sizeof같은 거로 최소값 잡아주고 마지막 값에는 0을 따로 넣어주어야 printf나 puts시 오류 안 생김

Posted by 知彼知己百戰不殆
,