首页 > 其他分享 >c: c语言——结构和指针

c: c语言——结构和指针

时间:2022-12-26 23:56:14浏览次数:36  
标签:语言 pb struct gender age member 指针 id 结构

 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

相关文章

  • 安卓逆向 -- APK文件结构
    apk文件其实就是一个压缩文件,解压后包含下面内容1、assets资源文件(图片、音频、数据库、网页、配置文件等),没有编译过,拿出来直接可以用2、res资源文件,需要编译才能看(布......
  • HTML5和CSS3的一些新特性-视屏,语音,表单,选择器,伪类,结构,before和after选择器,iconmoon 字
    HTML5和CSS3的一些新特性-视屏,语音,表单,选择器,伪类,结构,before和after选择器,iconmoon字体使用方法Html5:1.HTML5新增语义化标签<!DOCTYPEhtml><htmllang="en"><head>......
  • C语言开发环境搭建:VSCode+GCC
    文章目录​​一.VSCode介绍​​​​二.GCC编译器​​​​1.安装​​​​三.VScode中配置GCC​​一.VSCode介绍VSCode(全称:VisualStudioCode)是一款由微软开发且跨平台......
  • 数据结构——非线性结构(图)
    文章目录​​一.非线性结构的概述​​​​二.图的基本概念​​​​1.定义​​​​2.无向图、有向图​​​​2.1无向图​​​​2.2有向图​​​​2.3简单图​​​​2.......
  • C语言冒泡排序代码演示
     //---------冒泡排序 voidbubble_sort(intarr[],intsz) {   //确定冒泡排序的趟数   inti=0;   for(i=0;i<sz-1;i++)   {......
  • 网络拓扑结构可视化呈现方案
    随着数字化进程的加速,企业网络中设备的数量日益快速增长,网络规模逐渐庞大,组网结构、IT环境变的无比复杂,需要花费大量的时间和资源去监测网络运行状态,诊断解决故障问题。面......
  • C语言 -- 如何传递数组参数
    一、传递普通参数,直接传入即可voidarrprint(intarr){printf("%d\n",arr);}voidmain(){intarr=123;arrprint(arr);printf("aiyou");......
  • C语言 -- CreateProcess创建进程
    wchar_tlp[]=L"/ccalc";PROCESS_INFORMATIONpi={0};STARTUPINFOsi={0};BOOLb=CreateProcess(L"C:\\Windows\\System32\\cmd.exe",l......
  • 结构 Structs
    与引用类型Class不一样,结构体是一种值类型的数据结构,通过使用Struct关键字,我们可以在一个单一的变量中直接存储各种各样复杂的数据结构。语法:[访问修饰符]struct结构体......
  • js中的数据结构
    原始类型  数值字符串布尔值特殊值:undefined  null  合成类型 对象es6唯一的标识符symboljs中有三种方法确定一个值得类型typeofinstanceofObject.p......