c언어 struct 질문있습니다
14. 다음과 같은 문장을 수행하고 난 뒤의 a.field1의 값은?
struct test { int field1; };
void sub(struct test b)
{ b.field1 = 1;}
void main()
{ struct test a={ 0 }; sub(a); }
(1) -1 (2) 0 (3) 1 (4) 2
15. 다음과 같은 문장을 수행하고 난 뒤의 a.field1의 값은?
struct test { int field1; };
void sub(struct test *b)
{ b->field1 = 1; }
void main()
{ struct test a={ 0 }; sub(&a); }
(1) -1 (2) 0 (3) 1 (4) 2
두 문제 답이 왜 다른지 구체적이고 자세하게 초보자의 관점에서 설명해주세요ㅠㅠㅠ 그리고 struct test a={ 0 }은 현재 struct를 초기화하고 있는건가요?
14번 문제
struct test { int field1; }; void sub(struct test b) // (아래 main부터 보고 오세요) { // main에서 a의 값을 b에 받아왔습니다. b.field1 = 1; // b의 field1을 변경했습니다. } // 하지만 b는 a와 별개의 변수입니다. 값을 a에서 복사했을 뿐입니다! void main() { struct test a = { 0 }; // 여기서 a.field1이 0입니다. sub(a); // sub 함수에 a를 넘길 때, a를 복사해서 넘깁니다. } // 복사해서 넘긴 값을 아무리 지지고 볶아도 원래의 값은 그대로입니다.15번 문제
struct test { int field1; }; void sub(struct test *b) // (아래 main부터 보고 오세요) { // main에서 a의 주소를 받았습니다. 이제 원본 a의 값을 바꿀 수 있습니다. b->field1 = 1; // 아까 그 a의 field1을 1로 바꿨습니다. } // 이제부터 main에서 넘긴, 그 a의 field1도 1입니다. void main() { struct test a = { 0 }; // 여기서는 a.field1이 0입니다. sub(&a); // sub 함수에 a의 주소를 넘겼습니다! }올리신 저 두 문제의 중점은 함수 Parameter(param)로 값을 넘길 것이냐 ? 아니면 주소를 넘겨줄 것이냐? 입니다.
Call by value (값에 의한 호출)
Call by reference (참조에 의한 호출)
이런용어를 쓰지요.
14번은 Call by value
15번은 Call by reference
를 설명하려고 만들었나보네요.
14번의 a 의 주소를 0x00이라고 가정 할 경우 함수 Sub 의 내부로 들어가면 b 의 주소는 0x00이 아닙니다. 전혀 다른 메모리 주소이죠. 그래서 Sub 함수 가 끝나면 그 주소는 사라져서 값의 변화가 없습니다. 반면 15번은 a의 주소로 넘겨주기때문에 함수 내부로 들어가도 b는 0x00을 가리키게되죠!
다른 분들은 어떻게 쓰는지 모르겠지만 저 같은 경우 대부분 포인터를 넘겨서 씁니다.