1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
#include <stdio.h>
#include <stdlib.h>
struct Data {
int num;
int *numPtr; // 포인터
};
void func1(struct Data data){
printf("%d\n", data.num);
}
void func2(int num1, int num2){
printf("%d\n", num1+num2);
}
void func3(struct Data *data){
printf("%d\n", data->num);
}
void func4(int *num1, int *num2){
printf("%d\n", *num1+*num2);
}
int main()
{
int num1=10;
struct Data d1; // 구조체 변수
struct Data *d2 = (Data*)malloc(sizeof(struct Data)); // 구조체 포인터에 메모리 할당
d1.num=num1;
d1.numPtr=&num1;
d2->num=num1;
d2->numPtr=&num1;
//call by value
func1(d1); func2(d1.num, *d1.numPtr);
func1(*d2); func2(d2->num, *d2->numPtr);
//call by reference
func3(&d1); func4(&d1.num, d1.numPtr);
func3(d2); func4(&d2->num, d2->numPtr);
printf("%d\n", d1.num);
printf("%d\n", *d1.numPtr); // 10 : 구조체의 멤버를 역참조
//printf("%d\n", d1->numPtr); // [Error] base operand of '->' has non-pointer type 'Data'
printf("%d\n", d2->num); // 10: 구조체 포인터를 역참조하여 num에 접근
printf("%d\n", (*d2).num); // 10: 구조체 포인터를 역참조하여 num에 접근
// d2->num과 같음
//printf("%d\n", *d2.num); //[Error] request for member 'num' in 'd2', which is of pointer type 'Data*' (maybe you meant to use '->' ?)
printf("%d\n", *d2->numPtr); // 10: 구조체 포인터를 역참조하여 numPtr에 접근한 뒤 다시 역참조
printf("%d\n", *(*d2).numPtr); // 10: 구조체 포인터를 역참조하여 numPtr에 접근한 뒤 다시 역참조
// *d2->numPtr과 같음
free(d2);
}
|
cs |
'C > 잡다한 C' 카테고리의 다른 글
연결리스트의 배열 해보기! (0) | 2022.04.17 |
---|---|
난수 생성 (0) | 2022.04.15 |
scanf, gets, getchar (0) | 2022.04.03 |
선택정렬, 버블정렬 (0) | 2022.04.02 |
realloc 함수 주의할 점 (0) | 2022.03.31 |