Language Study/C

[C/C++] 09 - 02 구조체 변수와 함수, 포인터

지미닝 2022. 11. 24. 02:01

목차

  1. 구조체 변수와 함수
  2. 구조체 변수와 포인터
  3. 구조체 매개 변수 vs 구조체 포인터 매개 변수
  4. 구조체 변수와 함수의 인자
  5. 구조체가 쓰이는 C 표준 라이브러리 함수

1. 구조체 변수와 함수

✓ stud_swap() 함수

구조체 변수 값 swap을 위해 만든 함수인데 swap이 되지 않는다.

그 이유는 무엇일까?

Call by Value

  • scalar 형 자료형과 같이 구조체 변수 역시 매개변수로 값이 복사되어 감
  • 매개변수는 호출 시 사용한 변수와 별개이며 변화가 반영되지 않는다.

 

2. 구조체 변수와 포인터

구조체 자료형에 대한 포인터가 가능하다.

구조체 포인터에서 구조체 멤버를 접근하려면

->: 구조체 포인터의 멤버 변수 접근 연산자

3. 구조체 매개 변수 vs 구조체 포인터 매개 변수

배열의 경우

  • 대입 연산을 적용할 수 없으며
  • 함수 매개변수일 때 배열이 복사되는 것이 아니라 배열의 주소가 복사됨을 배웠다

구조체의 경우

  • 대입 연산을 적용할 수 있고
  • 함수 매개변수일 때 값이 복사되는 것을 확인하였다

stud_printx() vs stud_print()

  • stud_printx()는 구조체 자체를 매개 변수로 하여 전체 값의 복사가 발생
  • 복사하는 정보의 양: 구조체의 크기 만큼
  • stud_print()는 구조체 포인터를 매개 변수로 하여 주소 값의 복사가 발생
  • 복사하는 정보의 양: 포인터 크기 만큼
  • 메모리 복사 부하를 줄이려면 포인터 매개 변수를 사용하는 것이 바람직하다

 

4. 구조체 변수와 함수의 인자

① C언어에서 구조체 변수와 배열 변수의 대입 및 함수 인자 처리 과정에 차이가 있다.

② 메모리 복사는 CPU의 효율을 떨어뜨리는 연산이다

③ 구조체 변수를 인자로 할 경우 "구조체 복사"가 좋을지 "구조체 포인터" 사용이 좋을지 생각한다.

  • 포인터의 경우 메모리 복사 부하를 최소하는 장점이 있다
  • 다만 함수 내에서 원하지 않는 구조체의 내용 변경 등의 Side Effect가 발생할 수도 있다

 

5. 구조체에 쓰이는 C 표준 라이브러리 함수


요약