c语言——结构和指针
一、基础说明:成员运算符(.)和指针运算符(->)
0、变量的数据类型的说明:指针类型和非指针类型
0.1、指针类型的变量:指针类型,该变量需要赋予“地址”;
0.2 非指针类型的变量:非指针类型,此变量需要赋予相应的“常规数值”;
1、member-name1.member-name2.member-name3. ... .member-nameN:
1.1、操作对象:这个操作的最终对象是"member-nameN";
1.2、赋值:要根据“member-nameN”的数据类型赋值。
1.2.1、若 “member-nameN” 的数据类型是“指针”,则应该赋予它相应的“地址”; member-name1.member-name2.member-name3. ... .member-nameN = &variable;
1.2.2、若 “member-nameN” 的数据类型是“非指针类型”,则应该赋予它相应的“常规数值”; member-name1.member-name2.member-name3. ... .member-nameN = value ;
1.3、获取数值:根据“member-nameN”的数据类型读取数值。
1.3.1、如果"member-nameN"的数据类型是“指针”,那么获取它数值的方法: * (member-name1.member-name2.member-name3. ... .member-nameN) ;
1.3.2、如果“member-nameN”的数据类型是“非指针类型”,那么获取它数值的方法: member-name1.member-name2.member-name3. ... .member-nameN ;
1.4、总结:要根据最后一个变量(“menber-nameN”)的数据类型,进行相应地赋值和取值操作。
1.5、注意事项:最后一个变量“member-nameN”的数据类型,可以是“指针变量”也可以是“常规变量”。
2、pointer1 -> pointer2 -> pointer3 ... -> pointerN:
2.1、操作对象:这个操作的最终对象是“pointerN”;
2.2、赋值:要根据“pointerN”的数据类型赋值.
2.2.1、若 pointerN的数据类型 == “指针”,则应该赋予它相应的“地址”,则赋值方法为: pointer1 -> pointer2 -> pointer3 ... -> pointerN = &variable ;
2.2.2、若 pointerN的数据类型 == "非指针", 则应该赋予他相应的“常规数值”,则赋值方法为: pointer1 -> pointer2 -> pointer3 ... -> pointerN = value ;
2.3、获取数值:
2.3.1、如果 “pointerN的数据类型” == “指针”, 那么获取它数值的方法为: *(pointer1 -> pointer2 -> pointer3 ... -> pointerN) ;
2.3.2、如果“pointerN的数据类型” == “非指针”,那么获取它数值的方法为: pointer1 -> pointer2 -> pointer3 ... -> pointerN ;
2.4、总结:要根据指针所指的最后一个变量("pointerN")的数据类型,进行相应的赋值和取值操作。
2.5、注意事项:最后一个变量“pointerN”的数据类型,可以是“指针变量”也可以是“常规变量”。
3、参数传递:
3.1、数值传递:在函数体内,实参以数值形式给函数传入参数,为“数值传递”。数值传递方式,形参数值改变,不能改变实参。因为实参和形参拥有不同的内存位置,“形参内存的数据改变”不影响“实参内存的数据”。
3.2、指针传递(cpp指针和引用):在函数体内,实参以指针形式给函数传入参数,为“指针传递”。指针传递参数,形参数值改变,实参数值也改变。因为形参和实参拥有相同的内存位置,因此“形参内存的数据改变”影响“实参内存的数据”。
二、结构
1、结构体成员变量的赋值:
1.1、结构的成员变量,不能在全局位置赋值(“所有的函数体”以外的位置,是“全局位置”);
1.2、结构的成员变量,只能在某个函数体内进行赋值;
三、源码示例
1 [root@rocky c]# cat struct_pointer.c
2 /*
3 *
4 * date=2022-12-26
5 *
6 *
7 * struct notice:
8 *
9 * 0
10 * struct Object
11 * {
12 * char *sid;
13 * int *sage;
14 * char sgender;
15 * };
16 *
17 * strcut Object obj;
18 * struct Object ptobj=&obj;
19 *
20 * char id[]="laohu";
21 * int age=80;
22 * char gender="f";
23 *
24 *
25 * 1
26 * In the global position of c source file, to set values of members of struct variables is forbidden.
27 * You are able to set values of members of struct variables in a function. for example, function: init()/main().
28 *
29 *
30 * 2
31 * ( eg: obj, ptobj )Set these values for members of struct variables.
32 *
33 * member-name member-type member-value-type set value
34 *
35 * obj.sid pointer address obj.sid=id;
36 * obj.sage pointer address obj.sage=&age;
37 * obj.gender normal value obj.sgender=gender;
38 *
39 * ptobj->sid pointer address ptobj->sid=id;
40 * ptobj->sage pointer address ptobj->sage=age;
41 * ptobj->sgender normal value ptobj->sgender=gender;
42 *
43 * notice: 'struct-variable-name.struct-member-name' , we control a member of struct variable.
44 *
45 *
46 *
47 * 3 ( eg: obj, ptobj )Get the value of member of struct variables.
48 *
49 * member-name Getting their value Getting their address
50 * obj.sid obj.sid obj.sid
51 * obj.sage *(obj.sage) obj.sage
52 * obj.sgender obj.sgender &(obj.sgender)
53 *
54 * ptobj->sid ptobj->sid ptobj->sid
55 * ptobj->sage *(ptobj->sage) ptobj->sage
56 * ptobj->sgender ptobj->sgender &(ptobj->sgender)
57 *
58 *
59 *
60 *
61 *
62 *
63 *
64 *
65 *
66 * */
67
68
69 #include<stdio.h>
70 #include<stdlib.h>
71 #include<string.h>
72
73
74
75
76 struct big
77 {
78 char *id;
79 int *age;
80 int gender;
81 };
82
83
84
85
86 void init (struct big *pt, char *i, int *a, int g)
87 {
88 // important !!!
89 // setting values of members of struct variable
90 pt->id = i;
91 pt->age = a;
92 pt->gender = g;
93 }
94
95
96
97
98 void nmsg(struct big b)
99 {
100 // important !!!
101 // getting values of members of struct variable
102 printf("nmsg-value:\tb.id=%s, \tb.age=%d,\tb.gender=%d\n", b.id, *(b.age), b.gender);
103 printf("nmsg-address:\tb.id=%p,\tb.age=%p,\tb.gender=%p\n\n", b.id, b.age, &(b.gender));
104 }
105
106
107
108
109 void pmsg(struct big *pb)
110 {
111 printf("pmsg-value:\tpb->id=%s,\t*pb->age=%d,\tpb->gender=%d\n", pb->id, *(pb->age), pb->gender);
112 printf("pmsg-address:\tpb->id=%p,\t*pb->age=%p,\tpb->gender=%p\n\n", pb->id, pb->age, &(pb->gender));
113
114 }
115
116
117
118
119 int main(int argc, char *argv[], char *envp[])
120 {
121
122
123 char i1[] = "v1-root-1001";
124 int a1 = 10;
125 int g1 = 1;
126
127 struct big v1;
128 struct big *pt1 = &v1;
129
130 // important !!!
131 // setting value of member of struct variable
132 v1.id=i1;
133 v1.age=&a1;
134 v1.gender=g1;
135
136 nmsg(v1);
137 pmsg(pt1);
138
139
140
141 char i2[]="v2-root-2002";
142 int a2=20;
143 int g2=0;
144
145 struct big v2;
146 struct big *pt2=&v2;
147
148 init(&v2, i2, &a2, g2);
149
150 nmsg(v2);
151 pmsg(pt2);
152
153
154 return 0;
155 }
156 [root@rocky c]#
157 [root@rocky c]#
158 [root@rocky c]#
四、运行结果
1 [root@rocky c]# ./struct_pointer
2 nmsg-value: b.id=v1-root-1001, b.age=10, b.gender=1
3 nmsg-address: b.id=0x7ffc61b305f3, b.age=0x7ffc61b305ec, b.gender=0x7ffc61b30570
4
5 pmsg-value: pb->id=v1-root-1001, *pb->age=10, pb->gender=1
6 pmsg-address: pb->id=0x7ffc61b305f3, *pb->age=0x7ffc61b305ec, pb->gender=0x7ffc61b305e0
7
8 nmsg-value: b.id=v2-root-2002, b.age=20, b.gender=0
9 nmsg-address: b.id=0x7ffc61b305c3, b.age=0x7ffc61b305bc, b.gender=0x7ffc61b30570
10
11 pmsg-value: pb->id=v2-root-2002, *pb->age=20, pb->gender=0
12 pmsg-address: pb->id=0x7ffc61b305c3, *pb->age=0x7ffc61b305bc, pb->gender=0x7ffc61b305b0
13
14 [root@rocky c]#
15 [root@rocky c]#
五、参考文献:
1、 指向结构体的变量引用结构体的指针成员: https://blog.csdn.net/xwc374635420/article/details/37574747
2、 结构体全局变量赋值: https://www.cnblogs.com/any91/p/6560505.html
3、 (错误总结)结构体成员赋值: https://www.e-learn.cn/topic/3763774
本文由 lnlidawei 原创、整理、转载,本文来自于【博客园】; 整理和转载的文章的版权归属于【原创作者】; 转载或引用时请【保留文章的来源信息】:https://www.cnblogs.com/lnlidawei/p/17007158.html