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


구조체 변수의 선언

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 知彼知己百戰不殆
,