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
标签:语言,pb,struct,gender,age,member,指针,id,结构 From: https://www.cnblogs.com/lnlidawei/p/17007158.html