2022. 1. 20. 19:35ㆍC언어
왜 배열을 쓰지않고 구조체를 써야되는거죠? 라는 질문이 있었어요. 자 물론 구조체와 배열은 동일하게 묶는 역할을 합니다. 하지만 배열과의 차이점은 배열은 같은 자료형을 가진 공간에 값을 넣을 수 밖에 없고, 구조체 같은 경우 제가 필요하다고 생각되는 자료형을 만들어서 묶을 수 있는 차이가 있는거죠.
두번째 원본값과 참조값에 대한 설명입니다. 우리 배열같은 경우는 int hong[2]={1,2}; 라는게 있다고 생각했을때 값을 변경하기위해 우리는 int* arr = hong; 이런식으로 원본값을 넘기기보다는 주소값을 넘겨서 참조했고 원본 데이터를 넘기지는 않았습니다. 그렇지만 구조체 같은 경우는 struct person p2 = p1; 이런식으로 값을 넘길때 주소가 아니라 원본 데이터가 p2에 전체저장되었던거 age =22;를 통해 보셨던걸로 기억합니다. 그래서 조금 단어가 헷갈렸던게 원본값을 훼손하기 위해서는 참조를 해와야하는것이고요. 값복사와 같은 원본데이터를 가져오는 것으로는 원본을 훼손할 수 없다는 것 입니다. 배열에서 hong[0] = 50;으로 하고 arr[0]을 출력하면 당연히 주소값으로 수정을 했기에 원본이 훼손될거구요. 구조체에서 p1.age=23을 했다고 하면 원본값을 카피해서 저장한것이기 때문에 원본값에는 지장을 주지 않는다는것입니다. 그렇기에 구조체 변수의 원본값을 수정하기 위해서는 구조체 변수의 주소를 이용해야 합니다. 또한 s.name이 안되는 이유는 우선 매개변수 s는 구조체가 아니에요. 구조체 주소를 남을 수 있는 변수인거죠. 그리고 *s.name이 안되는 이유는 우리가 구조체s주소를 찾아가서 name을 달라고 하는게 맞는건데 주소값에다가 name달라고해서 찾아가게되면 이상한곳에 도달하게 되겠죠??그렇기에 (*s).name이 되야되는거고 이걸 편하게 하기위해서 구조체 전용참조 연산자를 통해 ->이 연산자를 보시면 바로 왼쪽에있는 변수가 아 구조체주소다라는걸 아시면 됩니다. 멤버연산이 역참조 연산보다 우선된다라는 사실은 외워두셔야 됩니다.
'C언어' 카테고리의 다른 글
C언어 요점 정리 - 정적할당 동적할당 비교 (0) | 2022.01.20 |
---|---|
C언어 부가 설명 - 구조체 연결리스트 (0) | 2022.01.20 |
C언어 요점 정리 - 구조체 (0) | 2022.01.19 |
C언어 요점 정리 - 문자열 상수와 변수의 차이 (0) | 2022.01.17 |
아스키코드 (0) | 2022.01.14 |