안녕하세요. 취업한 공대누나입니다.
오늘은 지난 시간에 이어 구조체에 대해 더 공부해보는 시간을 갖도록 하겠습니다.
지난 시간은 기본적인 것에 대해 공부를 했다면 이번에는 배열과 포인터에 대해 공부하겠습니다.
1. 구조체와 배열
1) 멤버 변수로 배열을 사용
구조체의 멤버 변수로 배열을 사용하는 것은 이전 포스팅에서 설명했던 방법과 같습니다.
computer라는 구조체 템플릿에 컴퓨터의 이름을 저장하기 위해서
10바이트의 문자열 배열인 name[10]을 선언하였습니다.
출력한 결과가 잘 나오는 것도 확인할 수 있습니다.
2) 구조체 변수로 배열을 사용하기
여기는 회사고 컴퓨터 물품을 관리한다고 생각해보겠습니다.
직원이 한 명이 아닌 이상 컴퓨터의 개수는 많을 것이고 구조체 변수가 많이 필요하게 될 것입니다.
우리는 매 번 하나하나씩 선언을 해 줄 필요가 없습니다.
예전에 배열 공부를 했듯이 구조체 또한 변수로 배열을 사용하면 됩니다.
struct computer pc[3]로 구조체 변수로 배열을 선언하고 초기화를 했습니다.
배열 요소는 0부터 시작하기 때문에 pc[0], pc[1], pc[2]가 생성이 됩니다.
위의 예제는 간단하게 2019년에 구매한 컴퓨터의 개수를 확인해보는 것입니다.
멤버에 접근하는 것 또한 이전과 크게 다르지 않으니 한 번 보고 넘어가주시면 될 것 같습니다.
3) 주의사항
위의 그림과 같이 소스 코드를 작성하게 되면 에러가 납니다.
이유가 무엇일까요?
배열 이름은 배열의 시작 주소인데 시작 주소에 문자열을 저장하고 있기 때문에 에러가 발생하게 됩니다.
그렇다면 어떻게 해야할까요?
바로 구조체 멤버 변수로 문자열 배열을 사용하는 경우 동시에 초기화하지 않으면
strcpy_s 함수를 사용해서 문자열을 저장하면 됩니다.
위의 그림과 같이 작성하게 될 경우 에러가 발생하지 않습니다.
2. 구조체와 포인터
이번에서는 구조체에서 포인터가 사용되는 경우를 보도록 하겠습니다.
1) 멤버 변수로 포인터를 사용하기
ram과 period를 포인터 변수로 선언하였습니다.
이렇게 선언하게 되면 ram과 period에는 int형 변수의 주소를 저장할 수 있게 됩니다.
main함수를 보도록 하겠습니다.
pc.ram에 ram_test의 주소를 저장했고 pc.period에 period_test의 주소를 저장하였습니다.
2) 구조체 변수로 포인터 사용하기
이번에는 구조체 변수로 포인터를 사용하는 방법에 대해서 보도록 하겠습니다.
여기서 왜 우리는 *pc2의 앞뒤에 괄호를 넣은걸까요?
.연산자가 *연산자보다 우선순위가 높아서 *pc2를 먼저 처리하게끔 하기 위해서입니다.
-> 변수는 포인터에만 사용이 됩니다.
따라서 위와 같이 멤버 변수에 접근할 수 있는 것도 알아두시면 좋습니다.
오늘은 구조체 배열과 포인터에 대해 공부해보았습니다.
아직 구조체에 대한 이야기가 끝나지 않았습니다.
공부를 해도 해도 끝이 없는 것 같네요.
다음에 다시 보도록 하겠습니다.