오늘은 C언어 구조체를 좀 더 자세히 알아보는 시간을 갖도록 하겠습니다. 먼저 처음 오신 분들은 아래의 C언어 구조체 기초내용을 포스팅한 것부터 보시는 것을 추천 드립니다.
https://mech19.tistory.com/203
C언어 구조체 기초
오늘은 구조체에 대해서 이야기 해 보려고 합니다. 구조체는 배열과 비슷하게 많은 데이터를 한번에 관리할 때 편리한 기능입니다. 다만 배열과의 차이점은 배열은 데이터의 타입이 한가지로
mech19.tistory.com
간단히 다시 정리해 보자면
구조체는 위와 같은 형태로 선언하며, 여러가지 데이터 타입을 가지는 멤버를 여러개 가질 수 있고, 이러한 조합을 구조체타입명을 지정하는 형태로 정의 하는 것입니다. 즉, 위에서 struct는 구조체를 의미하고, student는 int(정수)타입의 멤버 3가지를 가지는 구조체 타입명을 의미하며, math, english, avg는 각각의 멤버가 됩니다.
그리고 main함수에서 호출할 때는 구조체를 의미하는 struct와 구조체타입명을 의미하는 student뒤에 구조체명을 지어서 (여기서는 sg) 붙여주면 됩니다. 그러면 아래와 같이 sg.math, sg.english, sg.avg라는 개별 멤버가 생성된 것과 같습니다.
개별 멤버는 각각이 변수 혹은 배열의 원소와 같은 역할을 합니다. 접근방법은 일반적인 변수의 접근법과 같습니다. 그리고 이 구조체에 배열을 이용하는 방법은 지난시간에 알아보았었죠? 그럼 우리가 변수나 배열에 사용 했었던 포인터도 구조체에 사용할 수 있을까요? 당연히 됩니다. 지금부터 알아보도록 하겠습니다.
자~ 구조체를 선언한 부분은 특별한 내용이 없습니다. 여기서 주목해야 하는 부분은 main함수 안에서 구조체를 호출할 때 구조체 이름으로 포인터를 사용한 부분입니다.
구조체를 두번 호출 했는데 한번은 그냥 일반적인 구조체이름 sg를 사용하였고, 또 한번은 포인터형식인 *ptr을 사용하였습니다. 이렇게 함으로써 구조체 struct A *ptr은 구조체 포인터가 되었습니다. 구조체를 지목하는 포인터라는 의미지요. 그리고 나서 구조체 sg를 지목하게 하였습니다.
배열에서는 배열의 이름 자체가 곧 배열의 첫번째 원소의 주소값이었지만 구조체에서는 아닙니다. 그래서 &연산자를 붙여주어야 합니다. 이렇게 구조체 sg와 구조체포인터 ptr을 연동시키고 나서 ptr의 값을 바꾸어 보았습니다.
그리고는 구조체 sg의 멤버 a와 b의 값을 출력해 보았습니다.
역시 예상대로 구조체포인터의 값과 연동되어 구조체 sg의 값도 잘 바뀐것을 확인 할 수 있었습니다. 구조체포인터의 멤버에 접근할 때 쓰는 형식인 (*ptr).a 는 조금 불편하기 때문에 연산자 ->를 사용할 수도 있습니다. 사용법은 아래와 같습니다.
이렇게 사용해도 실행결과는 동일한 것을 알 수 있습니다. 그렇다면 한가지 의문이 생깁니다. 구조체자체를 포인터로 사용하는건 알겠는데... 구조체 멤버중에 하나를 포인터로 사용할 순 없을까? 당연히 가능합니다.
위 예제는 구조체포인터도 사용하였고, 구조체의 멤버중 하나를 포인터로 사용한 예제입니다. 특별하게 어려운 내용은 없기 때문에 직접 한번 작성하여 실행해 보시기 바랍니다.
오늘은 이렇게 구조체 심화과정으로 구조체포인터 및 구조체멤버포인터의 사용법을 알아보았습니다. 구조체는 많이 사용하기 때문에 정확히 알아두시는 것을 추천드립니다. 다음시간에는 구조체와 비슷한 것들에 대해서 좀 더 알아보는 시간을 갖도록 하겠습니다. 감사합니다.
제 블로그를 방문해 주셔서 감사합니다.
도움이 되셨다면 공감(좋아요) 부탁드리고,
댓글은 다른분들께도 좋은 정보일 수 있으니
공개로 부탁드립니다.
여러분의 작은 정성이 좋은 포스팅을 생산하는
힘이 된답니다. :)
감사합니다.
'PROGRAMMING > C' 카테고리의 다른 글
C언어 구조체 응용 (이중 구조체) (0) | 2022.12.08 |
---|---|
C언어 구조체 응용 (구조체와 함수) (0) | 2022.12.06 |
C언어 구조체 기초 (0) | 2022.11.28 |
C언어 Function 응용 #2 (사용자 정의 함수) (0) | 2022.11.23 |
C언어 함수의 원형 (0) | 2022.11.21 |
댓글