happy coding

[lecture] C언어복습.구조체 본문

lecture/data structure

[lecture] C언어복습.구조체

yeoonii 2022. 12. 27. 17:48

자료형에는 char, int, float, double 등 기본자료형과 배열, 열거형, 구조체, 공용체 등 파생자료형으로 나눌 수 있는데 그 중 하나인 구조체에 대해 배워보았다.

구조체란 같은 자료형으로 이루어진 배열과 다르게 서로 다른 자료형을 하나로 묶는 구조를 말한다. 

struct 구조체_태그_이름 {
	자료형 멤버_이름;
    자료형 멤버_이름;
    ...
};

구조체를 정의하는 것은 붕어빵 틀을 정의하는 것과 같고, 붕어빵을 실제로 만드릭 위해서는 구조체 변수를 선언해야 한다.

# 아직도 구조체랑 객체의 차이를 모르겠다 

구조체 멤버를 참조하려면 . 을 이용한다. 구조체명.구조체멤버명

링크드리스트 또한 구조체 형식을 포인터로 엮어둔 것이다.

같은 구조체 변수끼리 대입은 가능하지만 비교는 불가능하다.

구조체를 초기화할 때 중괄호를 이용해 한 번에 초기화시킬 수 있다.

//구조체 배열
struct student{
	int number;
    char name[20];
    double height;
};

int main(void)
{
	struct studnet list[100];	//구조체 배열 선언
    
    list[2].number = 27;
    strcpy(list[2].name, "홍길동");
    list[2].height = 178.0;
}
//구조체 배열 초기화
struct student list[3] = {
	{1, "Park", 172.8},
    {2, "Kim", 179.2},
    {3, "Lee", 180.3}
};

&s.number 에서 연산자 우선순위에 따라, 참조를 먼저 한 다음 address를 찾는다. s.name name자체는 char의 배열 주소가 되게 때문에 &가 붙지 않는다. (멤버 자체가 array 라서)

구조체 안에 구조체가 들어갈 수 있다. 

//구조체를 가리키는 포인터
struct student *p;
struct student s = {2020..., "홍길동", 180.2};
struct student *p;

p = &s;	//* 연산자를 이용해 포인터 p가 가르키는 데이터 a에 접근할 수 있음

printf(".. " , s.number , s.name, s.height);
printf(" ... ",(*p).number, (*p).name, (*p).height);	//연산자 우선순위때문에()사용
printf("... ", p->number, p->name, p->height);	//구조체 포인터; 구조체 멤버를 참조할 때 사용

 

(*p).number : *p 부분에서는, p가 가리키는 구조체 변수, 전체적으로는, p가 가리키는 구조체 변수의 멤버 number

p->number : 이 자체로 p가 가리키는 구조체 변수의 멤버 number

포인터의 크기는 무조건 4byte > 

s는 그냥 변수니까 . 으로 참조, dob는 포인터니까 -> 로 참조

자체 참조 구조체 : linked list 형태 : self referential 구조체 : 나와 같은 타입을 포인팅 하는 구조체

단일 연결 리스트의 구조

first = &s1;
s1.next = &s2;
s2.next = NULL;

구조체를 함수의 인수로 전달하는 경우 > 구조체의 복사본이 함수로 전달되게 되고 만약 구조체의 크기가 크다면 그만큼 시간과 메모리가 소요된다. 구조체의 포인터를 함수의 인수로 전달하는 경우, 그것을 절약할 수 있다. 예를 들어 구조체를 스칼라 변수로 선언하는 경우는 복사본이 그대로 함수로 전달되는데 call by value > copy 라고 한다. 구조체를 배열 변수로 선언하는 경우는 배열을 복사하는 것이 아니라 배열에 해당하는 포인터를 넘기는데 이를 call by reference 라고 한다. 구조체 값을 반환하는 경우 스칼라 변수와 동일하게 구조체의 복사본이 반환된다. 

//구조체를 함수의 인수로 전달하는 경우
int equal(struct student s1, struct student s2)
{
	if(strcmp(s1.name, s2.name) == 0)
    	return 1;
    else
    	return 0;
}
//구조체의 포인터를 함수의 인수로 전달하는 경우
int equal(struct student const *p1, struct student const *p2)
{
	if(strcmp(p1->name, p2->name) == 0)
    	return 1;
    else
    	return 0;
}

const 를 앞에 입력하면 "이 변수는 상수로 정의하겠다."라는 의미 >> 상수 포인터, 상수에 대한 포인터, 상수에 대한 상수 포인터

공용체

공용체(union)이란 같은 메모리 영역을 여러 개의 변수가 공유하는 것을 말한다. 공용체를 선언하고 사용하는 방법은 구조체와 비슷하다. 

c와 i의 메모리 공간이 따로따로 할당되는걸 구조체, 같은 장소에 메모리 할당되는 것을 공용체

열거형

열거형(enumeration)이란 변수가 가질 수 있는 값들을 미리 열거해놓은 자료형을 말하며, enum이라는 키워드를 사용해 만들어진다.

포인터배열 (*...[]) 

typedef

typedef 란 새로운 자료형을 정의하는 것이다. 기존 자료형을 새로운 자료형 명으로 선언해 두면 뒤에서 긴 자료형을 선언할 때마다 하던 수고스러움이 조금이나마 줄어든다.

char *p[4] = "abc"; 하면 *p = a 여기서 p는 상수니까 메모리를 차지하지 않지만, a는 변수니까 메모리를 차지한다. 여기서 *p = 'a', *(p+1) = 'b' .. 그리고 char *p = "abc"; 라고 하고 p의 값을 1000으로 선언하면 *p = 'a', *(p+1) = 'b' 이다. char *p[2] = {"abc", "def"}; 이라면, p[0] -> "abc", p[1] -> "def" .. 다시 말해 p[0]은 'a'를 포인팅하고 p[1]는 'b'를 포인팅한다. 여기서 *를 넣은 *p[0]의 값은 just 'a' 이다. 문자열 상수로 연산하는 경우, 예를 들어"abc" + 1 를 출력하려는 경우 포인터의 위치가 한 칸씩 옮겨가기 때문에  출력값은 bc 가 된다.

#define 과의 차이.

  • 코드를 컴퓨터 하드웨어에 독립적으로 만들 수 있기 때문에 이식성을 높여준다.
  • #define을 이용해도 typedef과 비슷한 효과를 낼 수 있다
  • 주석을 붙이는 것과 같은 효과를 내기 때문에 문서화의 역할을 겸한다.

*p, p = &s 이해 잘 안감

상수 포인터

https://ksr930.tistory.com/47

 

[C 언어] 포인터의 개념과 & / *연산자

포인터 포인터란 메모리상에 위치한 데이터의 주소를 보관하는 변수이다. int *p; 포인터 변수 p는 int형 데이터의 주소값을 저장할수있는 변수이다. & 연산자 포인터변수에 어떤 변수의 주소값을

ksr930.tistory.com

https://under-desk.tistory.com/37

 

C언어 기초 내용 정리 (2/2)

* 포인터란 A형 포인터(A*) A형 변수의 주소값을 저장 int *a char *b double *c &연산자 변수의 주소값 변환 *연산자 (기호가 *) 포인터가 가리키는 메모리 참조 ex) int a=20; int *p=&a; //a라는 변수의 주소값

under-desk.tistory.com

https://blockdmask.tistory.com/56

 

[C언어] 배열포인터, 포인터배열 정리 (pointer)

안녕하세요! BlockDMask 입니다 오늘은 많이들 햇갈려 하는 array pointer pointer array pointer pointer array array pointer. C언어의 포인터 개념과 배열 개념을 조금은 알고 계셔야 내용을 이해할 수 있을 것 입니

blockdmask.tistory.com

 

'lecture > data structure' 카테고리의 다른 글

[lecture] C언어복습.포인터 활용  (0) 2022.12.28
[lecture] C언어복습.포인터  (0) 2022.12.28
[lecture] C언어복습.배열  (0) 2022.12.27
[lecture] C언어 복습.문자와 문자열  (1) 2022.12.27
[lecture] 자료구조란  (0) 2022.12.27
Comments