lnlidawei

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 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

 

 

posted on 2022-12-26 23:45  lnlidawei  阅读(121)  评论(0编辑  收藏  举报