精华内容
下载资源
问答
  • 定义了一个指针类型指向这个结构体 <code class="language-cpp">typedef struct node_* node; struct node_{ node next; double float_value; };</code></pre> 现在我想通过类型node申请空间,我直接 ...
  • C语言中的结构体指针

    千次阅读 多人点赞 2017-01-16 23:45:08
    结构体指针的概念概念:结构体变量的地址,指向某个结构体变量(同时也是结构体变量中第一个元素的地址),我们可以通过结构体变量可以指向结构体中包含的一些成员定义: struct 结构体名 *结构体指针变量名;...

    ###C语言中的结构体指针

    1. 结构体指针概念
    2. 结构体变量成员访问
    3. 结构体指针作为函数参数
    4. 结构体数组指针
      5.结构体指针数组
    5. 结构体的自引用与不完全声明

    ####结构体指针的概念
    概念:结构体变量的地址,指向某个结构体变量(同时也是结构体变量中第一个元素的地址)
    结构体指针变量中的值是所指向结构体变量的地址
    我们可以通过结构体变量可以指向结构体中包含的一些成员

    定义一个结构体变量:

    	struct 结构体名 *结构体指针变量名;
    	如:struct address *addr;
    

    结构体指针变量初始化:

    结构体指针变量名 = &结构体变量;
    或者:结构体指针变量名 = &(结构体变量.第一个成员)
    

    注意:结构体指针必须要初始化以后才能够继续使用
    ####结构体变量成员的访问

    结构体指针 ->成员名;如addr->country;
    (*结构体指针).成员名;(*addr).country;//很少去进行使用,注意必须去使用(),,因为.优先级大于*
    结构体变量.成员名  stu.name
    

    注意:如果是结构体指针的话,它是可以指向自己的(引用自己)

    ####结构体指针作为函数参数
    C语言中结构体传递参数,传递的时间,和空间都是很大的,因为其在调用的时候都是拷贝调用,效率是严重降低,因此结构体作为参数传递的话,此时对于效率一块,将大大的节省,严重降低了程序的效率

    结构体指针作为函数参数传递,那么会有很大优化:(实参传向形参的只是一个地址)

    out_student(struct student *stup);
    //将结构体变量的地址传入进去
    

    ####结构体数组指针
    指向结构体数组的指针
    1:结构体指针可以指向一个结构体数组,结构体指针变量的值是整个结构体数组的首地址

    struct student  stus[] = {stu,stu2};
    struct student *stup2 = stus;
    

    2:结构体指针可以指向一个结构体数组中的变量,这时结构体指针变量的值就是该结构体数组元素的地址
    3:一个结构体指针虽然可以来访问结构体变量或结构体数组,但是不能指向结构体的成员

    ####结构体的指针数组
    结构体指针数组的使用对内存开销会大大降低

     struct student *stups [] = {stup1,&stu2};
    out_students(stups,2);
    

    ####结构体指针的自引用
    一个结构体内部包含一个指向该结构体本身的指针(必须是结构体指针)
    struct Self{
    int a;
    int b;
    struct Self *s; //必须是结构体指针,指向自身
    }

    结构体的不完整声明:
    当一个结构体中去引用另外一个结构体指针,但是另一个结构体又去引用了前一个结构体指针,这样就造成了结构体类似死锁的现象,这个时候就需要用结构体不完整声明,从而去避免这种

    struct B;
    struct A{
    	struct *B b;
    };
    struct B{
    	struct *A a;	
    };
    

    代码如下:

     struct address{
         char *country;
         char *city;
         char *street;
    };
    
    struct student{
        int xh; 
        char *name;
        int age;
        int gender;
        struct address *addr;
    };
    
    #include<stdio.h>
    #include"student2.h"
    #include<string.h>
    
    void out_student(struct student *stu);
    void out_students(struct student *stups[],int n);
    int main(void)
    {
        struct address addr1 = {"china","shanghai","beijing road"};
        struct student stu = {1,"zhangsan",10,1,&addr1};
        struct student *stup1 = &stu;
    
        struct address addr2={"jap","dongjing","hefei road"};
        struct student stu2 = {2,"lisi",11,2,&addr2};
    
        printf("student name:%s\n",stup1->name);
        printf("student street:%s\n",stup1->addr->street);
        printf("===================");
        out_student(stup1);
        out_student(&stu2);
    
        /*定义一个结构体的数据*/
        struct student  stus[] = {stu,stu2};
        struct student *stup2 = stus;
    
        int i ;
        for(i = 0 ;i < 2 ; i++)
        {
            out_student(stup2+i);
            printf("---------------------------------");
        }
    
        /*定义一个结构体指针数组*/
        struct student *stups [] = {stup1,&stu2};
        out_students(stups,2);
        return 0;
    }
    
    
    void out_student(struct student *stu)
    {
        printf("student xh:%d\n",stu->xh);
        printf("student name:%s\n",stu->name);
        printf("student gender:%d\n",stu->gender);
        printf("student age:%d",stu->age);
        printf("stduent country:%s\n",stu->addr->country);
        printf("student city:%s\n",stu->addr->city);
        printf("student street:%s\n",stu->addr->street);
        printf("*****************************");
        printf("size of:%d\n",sizeof(stu));
    }
    
    void out_students(struct student *stup[] ,int n)
    {
    	//代码省略
    }
    

    欢迎大家的访问,代码可以进行run,因为最近比较忙,所以可能质量有点小下降,后面会修正。谢谢大家的访问

    展开全文
  • c语言结构体学习整理(结构体初始化,结构体指针)

    万次阅读 多人点赞 2018-11-01 20:22:12
    c语言中交换两个结构体的值(结构体指针) 1关于语言的结构体: 首先我们为什么要用到结构体,我们都已经学了很多int char …等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活...

    渣渣c的c语言学习之路

    1.关于c语言的结构体:

    首先我们为什么要用到结构体,我们都已经学了很多int char …等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活使用,然而,在我们实际应用中,每一种变量进行一次声明,再结合起来显然是不太实际的,类如一位学生的信息管理,他可能有,姓名(char),学号(int)成绩(float)等多种数据。如果把这些数据分别单独定义,就会特别松散、复杂,难以规划,因此我们需要把一些相关的变量组合起来,以一个整体形式对对象进行描述,这就是结构体的好处。

    2首先我们要了解一些小知识

    2.1**只有结构体变量才分配地址,而结构体的定义是不分配空间的。**
    2.2结构体中各成员的定义和之前的变量定义一样,但在定义时也不分配空间。
    2.3结构体变量的声明需要在主函数之上或者主函数中声明,如果在主函数之下则会报错
    2.4c语言中的结构体不能直接进行强制转换,只有结构体指针才能进行强制转换
    2.5相同类型的成员是可以定义在同一类型下的
    列如

    
    struct Student
    { 
    	int number,age;//int型学号和年龄
    	char name[20],sex;//char类型姓名和性别
    	float score;
    }

    最后的分号不要忘了 有的编译器会自动加上,因此有的同学就会不注意。

    3关于结构体变量的定义和引用

    在编译时,结构体的定义并不分配存储空间,对结构体变量才按其数据结构分配相应的存储空间

    
     struct Book
     { 
     	char title[20];//一个字符串表
    
    示的titile 题目
    	char author[20];//一个字符串表示的author作者
     	float value;//价格表示 
     };//这里只是声明 结构体的定义 
    struct Book book1,book2;//结构体变量的定义 分配空间
    
    book1.value;//引用结构体变量
    

    定义结构体变量以后,系统就会为其分配内存单元,比如book1和book2在内存中占44个字节(20+20+4)具体的长度你可以在你的编译器中使用sizeof关键字分别求出来。
    列如

    当然,要注意一点:用sizeof关键字求结构体长度时,返回的最大基本类型所占字节的整数倍 比方说我们上面求得的为44 为 float(4个字节)的整数倍,
    但是我们把title修改为title[22]; 这时正常长度为46 ,但是你会发现实际求得的为48,(4的整数倍)

    这就涉及到结构体的存储

    1结构体整体空间是占用空间最大的成员(的类型)所占字节数的整数倍。

    2.结构体的每个成员相对结构体首地址的偏移量(offset)都是最大基本类型成员字节大小的整数倍,如果不是编译器会自动补齐,

    关于这个我们简单介绍下:

    1.偏移量----偏移量指的是结构体变量中成员的地址和结构体变量首地址的差。即偏移字节数,结构体大小等于最后一个成员的偏移量加上他的大小,第一个成员的偏移量为0,

    struct S1
    {
        char a;
    
        int b;
    
        double c;
    };
    

    这里char a 偏移量为1 之后为int b 因为偏移量1不为int(4)的整数倍,所以会自动补齐,而在 double c 时,偏移量为8 是double(8)的整数倍,所以不用自动补齐 最后求得结构体得大小为 16

    具体看下图:
    在这里插入图片描述
    通过上面的代码同学们应该会有一个简单的认知

    4结构体变量的初始化

    结构体的初始化有很多需要注意的地方,这里我们说明下
    首先是几种初始化的方法
    ps在对结构体变量初始化时,要对结构体成员一一赋值,不能跳过前面成员变量,而直接给后面成员赋初值,但是可以只赋值前面几个,对与后面未赋值的变量,如果是数值型,则会自动赋值为0,对于字符型,会自动赋初值为NULL,即‘\0’

    4.1定义时直接赋值

    struct Student
    { 
    	char name[20];
    	char sex;
    	int number;
    }stu1={"zhaozixuan",'M',12345};
    //或者
    struct Student
    { 
    	char name[20];
    	char sex;
    	int number;
    }struct Student stu1={"zhaozixuan",'M',12345};
    
    

    注意字符为‘ ’ 字符串为""
    4.2定义结构体之后逐个赋值

    stu1.name="王伟";
    stu1.sex='M';
    stu1.number=12305;
    //也可用strcpy函数进行赋值
    strcpy(stu1.name,"王伟");
    
    

    4.3定义之后任意赋值

     struct Student stu1={
      .name="Wang",
      .number=12345,
      .sex='W', 
     };//可以对任意变量赋值
    

    这样写的好处时不用按照顺序来进行初始化,而且可以对你想要赋值的变量直接进行赋值,而不想赋值的变量可以不用赋值

    需要注意的是如果在定义结构体变量的时候没有初始化,那么后面就不能全部一起初始化了;

    等下结构体数组初始化时我们还会有一个讲解

    这里我们顺带提一下typedef说明结构体类型


    这里的BOOK就相当于struct book的一个别名一样,用它来定义结构体变量非常简便
    主要也是考二级要用到,所以我们简单介绍下

    5结构体变量的引用(输出和输入)

    5.1结构体变量的赋值用scanf赋值和printf输出时跟其他变量操作一样
    但是有几点需要注意
    (1) .是运算符,在所有运算符优先级中最高
    (2)如果结构体的成员本身是一个结构体,则需要继续用.运算符,直到最低一级的成员。

    struct Student
    {	char name[20];
    	char sex;
    	int number;
    	struct Date
    	{
    		int year;
     		int month;
     		int day;
    	}birthday;
    
    }stu1;
    printf("%d",stu1.birthday);//这样子是错误的,因为birthday也是一个结构体变量
    scanf("%d",&stu1.birthday.month);//正确
    

    (3)可以引用接头体变量成员的地址,也可以引用结构体变量的地址:

    printf("%o", student);(输出student的首地址)(%o 按八进制输出)

    6结构体数组及其初始化(重点)

    这里我们简单说下,具有相同类型的结构体变量组成数组就是结构体数组

    结构体数组与结构体变量区别只是将结构体变量替换为数组

    struct Student
    { 
    	char name[20];
    	char sex;
    	int number;
    }stu1[5]={
    	 {"zhaozixuan",'M',12345},
    	 {"houxiaohong",'M',12306},
    	 {"qxiaoxin",'W',12546},
    	 {"wangwei",'M',14679},
    	 {"yulongjiao",'W',17857}
    };
    stu1[3].name[3]//表示stu1的第三个结构变量中姓名的第五个字符
    //若初始化时已经是结构体数组全部元素[]中的数可以不写如stu1[]=
    

    注意结构体数组要在定义时就直接初始化,如果先定义再赋初值是错误的
    比如:

    struct Student stu1;
    stu1[3]={
      {"zhaozixuan",'M',12345},
      {"houxiaohong",'M',12306},
      {"qxiaoxin",'W',12546}
      };
      
    

    这样子是错误的,

    这里我在写的时候遇到一些问题,还是结构体数组初始化的问题,折腾了下解决了,给大家分享下
    对于数组初始化时
    比如

    char str[20];
    str="I love you";/* 这样会修改数组的地址,但是数组的地址分配之后是不允许改变的 */
    
    

    在第一条语句中 str就已经被定义成数组而在C99标准中不允许将字符串(实际上是一个指针变量) 赋值给数组,所以如果我们直接赋值是错误的

    那么怎么弄呢
    这里提供3种方法

    1.定义数组时直接定义
    char str[20]=“I love you”;

    2.用strcpy或者memset函数进行复制
    char str[20];
    strcpy(str,“I love you”);
    再用到memset函数时,出现了一些问题
    对于memcset函数简单介绍下

    memset
    void *memset(void *s,int c,size_t n)
    作用:将已开辟内存空间s的首n个字节的值设为值c。

    char str[20];
    memset(str,'a',20);
    

    如果是字符类型数组的话,memset可以随便用,但是对于其他类型的数组,一般只用来清0或者填-1,如果是填充其他数据就会出错

    int str[10];
    memset(str,1,sizeof(str));//这样是错误的
    
    

    这里我们说下这个错误,

    首先我们要知道memset在进行赋值时,是按字节为单位来进行赋值的,每次填充的数据长度为一个字节,而对于其他类型的变量,比如int,占4个字节 所以sizeof(str)=40; 而用memset赋值时,将会对指向str地址的前40个字节进行赋值0x01(00000001) 的操作,把0x00000000赋值4次0x01操作变为0x01010101(00000001000000010000000100000001)

    相当于给“前10个int”进行了赋值0x01010101的操作 对应十进制的16843009
    所以会出很大的错误

    这里请务必要注意,但是如果是清零一个数组用memset还是很方便的
    简单使用的话同学们用strcmp函数就行

    3用指针(注意内存分配)
    char *str;
    str=“I love you”;

    这两句话的本质是,在内存中开辟一段内存空间,把"I love you"放进这段内存空间,然后把这段内存空间的地址交给str,由于str是变量,所以给它赋值是合法的。

    请注意,在我们进行数组初始化的时候如果定义的数组过长,而我们只初始化了一部分数据,对于未初始化的数据如果是数值型,则会自动赋值为0,对于字符型,会自动赋初值为NULL,即‘\0’ 即不足的元素补以默认值
    这里我们在4小节中也提到了
    比如

    int str[10]={1};//这里只是把str的第一个元素赋值为1,其他元素默认为0
    
    



    7结构体与指针

    我们知道,指针指向的是变量所占内存的首地址,在结构体中,指针指向的是结构体变量的起始地址,当然也可指向结构体变量的元素
    这里我们分为三部分
    7.1指向结构体变量的指针

    定义形式一般为
    struct 结构体名* 指针名;
    比如: struct Student* p;

    struct Student
    {	
    	char cName[20];
     	int number;
     	char csex;  
    }student1;
    struct Student*p;
    p=&student1;
    //若为结构体数组则
    struct Student stu1[5];
    struct Student*p;
    p=stu1;//因为stu1为结构体数组而p=stu1直接是指向stu1的首地址,就不用再加&符
    
    

    用结构体指针变量访问结构体变量成员有以下两种方式:
    (*p).cName //这里的括号不能少,在5.1中有提到
    p->cName

    简单来说以下三种形式是等价的

    p->cName
    (*p).cName 
    student1.cName
    p->cName //可以进行正常的运算
    

    p->number++; 是将结构体变量中number的值进行运算,然后再加一,
    这里要注意下,等下在7.2中会有比较

    7.2指向结构体数组的指针

    7.1中我们已经提到结构体数组指针的命名,这里我们仅对一些知识点做下介绍
    这里我们接着来说结构体数组指针
    在我们想要用指针访问结构体数组的第n个数据时可以用

    struct Student stu1[5];
    struct Student*p;
    p=stu[n];
    (++p).number//是指向了结构体数组下一个元素的地址
    
    

    7.3结构体成员是指针类型变量
    比如

    struct Student
    {
     	char* Name;//这样防止名字长短不一造成空间的浪费
     	int number;
     	char csex;  
    }student1;
    
    

    在使用时可以很好地防止内存被浪费,但是注意在引用时一定要给指针变量分配地址,如果你不分配地址,结果可能是对的,但是Name会被分配到任意的一的地址,结构体不为字符串分配任何内存存储空间具有不确定性,这样就存在潜在的危险,

    struct Student
    {
     	char* Name;
     	int number;
     	char csex;  
    }stu,*stu;
    
    stu.name=(char*)malloc(sizeof(char));//内存初始化
    

    这里我们说一下,同学们看书的时候一般不会看到,
    如果我们定义了结构体指针变量,他没有指向一个结构体,那么这个结构体指针也是要分配内存初始化的,他所对应的指针类型结构体成员也要相应初始化分配内存

    struct Student
    {
     	char* Name;
     	int number;
    	char csex;  
    }stu,*stu;
    stu = (struct student*)malloc(sizeof(struct student));./*结构体指针初始化*/
      stu->name = (char*)malloc(sizeof(char));/*结构体指针的成员指针同样需要初始化*/  
    
    

    7.4二叉树遍历算法
    二叉树的二叉链表类型定义如下:
    typedef struct btnode {
    datatype data;
    struct btnode *lchild,*rchild;
    };
    这里我们仅仅提出以下,因为涉及到链表,感兴趣的同学可以去学习下(二级要用),
    7.5结构体作为函数参数

    首先我们要注意的一点,使用结构体变量作为函数参数的时候,采取的是值传递的方式,将结构体所占内存单元的内容全部传递给形参,并且形参必须也要是同类型的结构体变量,在使用时,会自动创建一个结构体变量作为原变量的副本,并且也需要占内存,并且在调用期间如果修改(形参)结构体中成员的值,修改值是无效的

    而如果用指针作为实参,传递给函数的形参,这时候传递的是结构体的地址,形参所指向的地址就是结构体变量的地址,这时候进行修改的话是可以修改的,这正是指针的精华所在

    在这里我们再提供几种互换两个结构体的方法

    struct Student
    {
     char cName[20];
     int number;
     char csex;  
    }student1,student2;
    struct Student student1={"Wang",12345,'W'};
    struct Student student2={"Zhao",54321,'M'}; 
    struct Student*stu1=&student1;
    struct Student*stu2=&student2;
    
    struct Student *student3;
    student3=stu1;
    stu1=stu2;
    stu2=student3;//互换地址
    
    2对于同类型结构体直接互换值就行
    struct stu student3;
    student3=student1;
    student1=student2;
    student2=student3;
    //这里也可以写成应strcmp函数互换
    
    3memcpy()函数进行互换
    
    
    4比较笨的方法: 用for循环互换
    

    最后提下memset清空结构体

    struct Student
    {
     char cName[20];
     int number;
     char csex;  
    }stu1;
    
    一般情况下,清空str的方法:
      str.cName[0]='\0';
      str.csex='0';
      str.number=0;
      但是我们用memset就非常方便:
      memset(&str,0,sizeof(struct Student));
      如果是数组:
      struct Student stu[10];
      就是
      memset(stu,0,sizeof(struct Student)*10);
    

    整理不易,点个赞再走呗!

    展开全文
  • 例40:C语言实现通过指向结构体变量的指针变量变量输出结构体变量中的信息。 解题思路:在主函数中声明了struct student类型,然后定义了一个struct student类型的变量s_1,又定义了一个指针变量p,它指向一个struct...

    例40:C语言实现通过指向结构体变量的指针变量变量输出结构体变量中的信息。

    解题思路:在主函数中声明了struct student类型,然后定义了一个struct student类型的变量s_1,又定义了一个指针变量p,它指向一个struct student类型的对象,将结构体变量s_1的起始地址赋给指针变量p,也就是使p指向s_1,然后对s_1的各个成员赋值。

    源代码演示:

    #include<stdio.h>//头文件 
    #include<string.h>//为了引用strcpy函数 
    int main(){//主函数 
      struct student{  //学生结构体 
        int num;
        char name[20];
        char sex;
        float score;
      };
      struct student s_1;//定义结构体变量 
      struct student *p;//定义结构体指针变量 
      p=&s_1;//将s_1得地址赋给指针变量 
      s_1.num=10010;//赋值 
      strcpy(s_1.name,"yan");//复制 
      s_1.sex='M';//赋值 
      s_1.score=100;//赋值 
      printf("学号是:%d\n名字是%s\n性别是:%c\n成绩是:%f\n",
      s_1.num,s_1.name,s_1.sex,s_1.score); //输出结果 
      printf("--------------------\n"); //隔开 
      printf("学号是:%d\n名字是%s\n性别是:%c\n成绩是:%f\n",
      (*p).num,(*p).name,(*p).sex,(*p).score); //输出结果 
      return 0;//主函数返回值为0 
    }
    

    编译运行结果如下:

    学号是:10010
    名字是yan
    性别是:M
    成绩是:100.000000
    --------------------
    学号是:10010
    名字是yan
    性别是:M
    成绩是:100.000000
    
    --------------------------------
    Process exited after 1.116 seconds with return value 0
    请按任意键继续. . .
    

    思考两个问题,怎么对结构体变量成员赋值?怎么通过指向结构体变量的指针访问结构体变量中成员?

    C语言指向结构体变量的指针变量
    更多案例可以go公众号:C语言入门到精通

    展开全文
  • 时间不是很充裕就只摆示范代码和注释了 看完这些样例代码就能理解透彻了 #include<stdio.h> #include<string.h> ...意思是把变量a赋值为1 int是变量类型(要定义自己的类型用结构体.
    • 时间不是很充裕就只摆示范代码和注释了
    • 看完这些样例代码就能理解透彻了
    #include<stdio.h>
    #include<string.h>
    
    //结构体、指针、别名组合在一起容易记混,下面给出常见几种组合
    //要区分清楚的关键在于理解声明变量的语法是   变量类型(int、struct struct_name、int*,类型后面带*代表是该类型的指针变量)  变量名字 =值;  例如   int a = 1;意思是把变量a赋值为1  int是变量类型(要定义自己的类型用结构体)  a是变量名字(自己取的) =代表赋值操作 1是值  ;是代表这一个语句结束 
    //理解清楚结构体的基本格式
    /*
    定义一个结构体,结构体名字为user,两个成员变量  
    struct user{
    	char username[20];
    	char password[20];
    };
    使用这个结构体声明一个结构体变量
    struct user xiaoming;
    struct user xiaoming={"xiaoming","123456"};
    修改(由于是长度不相同的两个字符数组,用strcpy方便点,如果是数字等直接 xiaoming.age=18;) 
    strcpy(xiaoming.username,"xiaoming_modified") 
    */ 
    /*
    定义一个结构体,结构体名字为user,两个成员变量 ,声明了一个结构体变量,名字叫xiaoming 
    struct user{
    	char username[20];
    	char password[20];
    }xiaoming;
    */ 
    /*
    定义一个结构体,结构体名字为user,两个成员变量 ,声明了一个结构体变量,名字叫xiaoming并赋值了 
    struct user{
    	char username[20];
    	char password[20];
    }xiaoming={"xiaoming","123456"};
    */ 
    /*
    定义一个结构体,结构体名字为user,两个成员变量 ,声明了一个结构体变量,名字叫xiaoming并赋值了 ,另外定义了一个结构体指针变量 
    struct user{
    	char username[20];
    	char password[20];
    }xiaoming={"xiaoming","123456"},*p;
    p=&xiaoming;//这样p就指向了xiaoming这个变量,指针变量可以理解为是一个可以用来指向变量的变量 
    strcpy(p->username ,"xiaoming_modified");//使用指针变量操作被指向变量的数据时使用箭头->,而结构体变量时使用点. 
     
    */ 
    /*
    typedef struct {
    	char username[20];
    	char password[20];
    } user;
    */ 
    struct user{
    	char username[20];
    	char password[20];
    }xiaoming={"xiaoming","123456"},*p;
    
    void new_line(){
    	//打印使用printf函数,%d输出整数  %s输出字符串  %c 输出字符  %p打印内存地址   %x输出16进制数字   %o输出8进制   如果使用的输出格式定义没定义对有可能造成没有输出
    	printf("\n");//打印个换行 
    }
    
    
    
    int main(){
    	p=&xiaoming;
    	strcpy(p->username ,"xiaoming_modified");
    	printf("%s",xiaoming.username);
    	return 0;
    } 
    
    #include<stdio.h>
    #include<string.h>
    
    //定义一个结构体并创建一个结构体变量 
    
    /*结构体语法  []代表可选 
    struct [结构体名字] {
    	[结构体成员类型]  [结构体成员名字][=结构体成员的值];
    }[结构体变量]; 
    
    例如
    struct user{
    	char username[20];
    	char password[20];
    };
    可以预先赋值 
    struct user{
    	char username[20]="xiaoming";
    	char password[20];
    };
    可以预先声明结构体变量 
    struct user{
    	char username[20];
    	char password[20];
    }xiaoming;
    可以预先声明结构体变量并且赋初值 
    struct user{
    	char username[20];
    	char password[20];
    }xiaoming={"xiaoming","123456"};
    
    访问成员变量时用点和箭头的区别
     .     类型为结构体变量使用          struct user xiaoming;strcpy(xiaoming.username,"xiaoming");
     ->    类型为结构体指针变量时使用  struct user *xiaoming;strcpy(xiaoming->username,"xiaoming");
    */
    struct user{
    	char username[20];
    	char password[20];
    };
    
    void new_line(){
    	//打印使用printf函数,%d输出整数  %s输出字符串  %c 输出字符  %p打印内存地址   %x输出16进制数字   %o输出8进制   如果使用的输出格式定义没定义对有可能造成没有输出
    	printf("\n");//打印个换行 
    }
    void print_user(struct user u){
    	//打印User结构体 
    	printf("struct user {");
    	new_line();
    	printf("    username:\"%s\",",u.username);
    	new_line();
    	printf("    password:\"%s\"",u.password);
    	new_line();
    	printf("    }");
    	new_line();
    }
    int main(){
    	//定义一个结构体变量  struct user 变量名; 
    	struct user xiaoming;
    	//	xiaoming.username="xiaoming";//这样是不行的,因为username那边是20个字符,这边不足,要么补\0 要么用strcpy 
    	strcpy(xiaoming.username,"xiaoming");
    	strcpy(xiaoming.password,"123456");
    	print_user(xiaoming);
    	return 0;
    } 
    
    #include<stdio.h>
    #include<string.h>
    
    //定义一个结构体并在定义时就声明一个结构体变量并且赋值 
    
    // 声明后不赋值写法,后面再自己赋值也可以 
    // struct user{
    //	char username[20];
    //	char password[20];
    //}xiaoming;
    
    struct user{
    	char username[20];
    	char password[20];
    }xiaoming={"xiaoming","123456"};
    
    void new_line(){
    	//打印使用printf函数,%d输出整数  %s输出字符串  %c 输出字符  %p打印内存地址   %x输出16进制数字   %o输出8进制   如果使用的输出格式定义没定义对有可能造成没有输出
    	printf("\n");//打印个换行 
    }
    void print_user(struct user u){
    	//打印User结构体 
    	printf("struct user {");
    	new_line();
    	printf("    username:\"%s\",",u.username);
    	new_line();
    	printf("    password:\"%s\"",u.password);
    	new_line();
    	printf("    }");
    	new_line();
    }
    int main(){
    	print_user(xiaoming);
    	return 0;
    } 
    
    #include<stdio.h>
    #include<string.h>
    
    //定义一个结构体并在定义时就创建一个结构体变量并赋初值,然后使用这个进行复制 
    
    
    
    struct user{
    	char username[20];
    	char password[20];
    }xiaoming={"xiaoming","123456"};
    
    void new_line(){
    	//打印使用printf函数,%d输出整数  %s输出字符串  %c 输出字符  %p打印内存地址   %x输出16进制数字   %o输出8进制   如果使用的输出格式定义没定义对有可能造成没有输出
    	printf("\n");//打印个换行 
    }
    void print_user(struct user u){
    	//打印User结构体 
    	printf("struct user {");
    	new_line();
    	printf("    username:\"%s\",",u.username);
    	new_line();
    	printf("    password:\"%s\"",u.password);
    	new_line();
    	printf("    }");
    	new_line();
    }
    int main(){
    	struct user libai=xiaoming;
    	strcpy(xiaoming.username,"x");
    	print_user(libai);
    	print_user(xiaoming);
    	return 0;
    } 
    
    #include<stdio.h>
    #include<string.h>
    
    //定义一个结构体并取别名(其实也就是定义一个新的类型) 
    
    /*
    首先了解一下typedef命令
     typedef int number;
     上面命令给int取了个别名叫number,或者理解为顶一个了一个新的类型,这个类型名字是number,类型是int ,到后面类型是某个结构体,就是定义了一个新的类型 
    */ 
    
    typedef struct {
    	char username[20];
    	char password[20];
    }user;
    
    void new_line(){
    	//打印使用printf函数,%d输出整数  %s输出字符串  %c 输出字符  %p打印内存地址   %x输出16进制数字   %o输出8进制   如果使用的输出格式定义没定义对有可能造成没有输出
    	printf("\n");//打印个换行 
    }
    
    void print_user(user u){
    	//打印User结构体 
    	printf("struct user {");
    	new_line();
    	printf("    username:\"%s\",",u.username);
    	new_line();
    	printf("    password:\"%s\"",u.password);
    	new_line();
    	printf("    }");
    	new_line();
    }
    int main(){
    	//使用别名user来创建结构体变量 
    	user xiaoming;
    	strcpy(xiaoming.username,"xiaoming");
    	strcpy(xiaoming.password,"123456");
    	print_user(xiaoming); 
    	return 0;
    } 
    
    #include<stdio.h>
    #include<string.h>
    
    //定义一个结构体并使用结构体指针 
    
    
    struct user {
    	char username[20];
    	char password[20];
    };
    
    void new_line(){
    	//打印使用printf函数,%d输出整数  %s输出字符串  %c 输出字符  %p打印内存地址   %x输出16进制数字   %o输出8进制   如果使用的输出格式定义没定义对有可能造成没有输出
    	printf("\n");//打印个换行 
    }
    void print_user(struct user u){
    	//打印User结构体 
    	printf("struct user {");
    	new_line();
    	printf("    username:\"%s\",",u.username);
    	new_line();
    	printf("    password:\"%s\"",u.password);
    	new_line();
    	printf("    }");
    	new_line();
    }
    
    void print_user(struct user *u){
    	//打印User结构体 
    	printf("struct *user {");
    	new_line();
    	printf("    username:\"%s\",",u->username);
    	new_line();
    	printf("    password:\"%s\"",u->password);
    	new_line();
    	printf("    }");
    	new_line();
    }
    int main(){
    	struct user  xiaoming;//创建一个结构体变量 
    	strcpy(xiaoming.username,"xiaoming");
    	strcpy(xiaoming.password,"123456");
    	print_user(xiaoming); 
    	
    	struct user *u=&xiaoming;//创建一个结构体指针变量指向xiaoming, 
    	strcpy(u->username,"u");//使用指针变量去改变值 
    	print_user(u); 
    	print_user(xiaoming); //被指向的xiaoming的值也被改变了 
    	return 0;
    } 
    
    展开全文
  • 结构体定义与使用 结构体是一种构造数据类型 把不同类型的数据组合成一个整体 结构体定义形式: struct 结构体名{ 结构体所包含的变量或数组 }; 结构体是一种集合,它里面包含了多个变量或数组,它们的...
  • C语言指向结构体的指针,如何...定义结构体并定义结构体指针让其指向结构体 #include<stdio.h> #include<string.h> typedef struct stud{//定义了一个结构体 char Id[10];//学号 char Name[10];...
  • struct T ** ptr, 说白了 就是一个结构体指针的数组,数组内都是指针,还要分配内存。 1,结构体指针用法一: struSysInfo *SysInfo; SysInfo = (struSysInfo*)malloc(sizeof(struSysInfo)); SysInfo->...
  • C语言中运用结构体指针输出结构体中的变量 #include<stdio.h> struct Data{ int year; int mounth; int day; }data; int main(){ Data data={2020,11,7}; struct Data *ptr; ptr=&data; printf("%...
  • 定义指向结构体类型变量的指针变量:struct stu *p1, *p2 ;定义指针变量p 1、p 2,分别指向结构体类型变量。引用形式为:指针变量→成员;[例7-2] 对指向结构体类型变量的正确使用。输入一个结构体类型变量的成员...
  • 前言 如果对结构体变量的使用不太熟悉,可以先看看博主的这篇文章【C语言】结构体变量定义、初始化、使用 一、定义 1 先声明结构体类型、定义结构体变量:...//定义指向结构体变量的指针 struct students *pstu...
  • C语言结构体和结构体指针的简单用法 这里总结一下自己的学习笔记,关于C语言当中的结构体指针的用法,以及结构体简单使用。 简单介绍一下今天出场的嘉宾–>结构体和结构体指针 什么是结构体: 1,定义多种类型的...
  • C 语言学习笔记结构体 02...可就愁死人了比如说数组一点都不难但是与指针一起用可就经常麻烦了结构体也是一种结构它与指针搭配怎么样呢 一起来看一下吧 1结构体指针变量和指针指向数组首地址一样指针也可以指向结构体
  • c语言typedef 与结构体指针

    千次阅读 2018-10-23 11:08:38
    //这里我们用typedef把emp这个结构体变成了*emp这种指向结构体成员的结构体指针 /*typedef struct emp{  char sex[8];  char name[15];  int age; }pi,*emp;//为了程序的可读性最好不要这样声明*/ int ...
  • c语言结构体内嵌结构体指针Prerequisite: 先决条件: Structures in C programming language. C编程语言中的结构。 Dynamic Memory allocation functions in C. C中的动态内存分配功能。 Example: In this ...
  • 数组定义: char acBuf[sizeof(TRANS_HEAD_S) + sizeof(USER_HEAD_S) + 4] = {0};...结构体定义: typedef struct { int iOne; int iTwo; int iThr; }TRANS_HEAD_S; typedef struct { int iUser; }USER...
  • C语言结构体数组+结构体类型指针+指向结构体数组的指针+typedef类型结构体数组两种结构体数组的定义形式用sizeof运算符求结构体数组所占字节数结构体类型指针指向结构体数组的指针typedef类型 结构体数组 如果要处理...
  • 这是我学习C语言指针部分的笔记,指针...下面是我根据学习的要点,编写的两篇关于指针和结构体指针的引用实例,算作笔记吧,同时也方便自己以后查看,分享出来大家学习学习,有错误的话希望相互指正,感谢!话不多说...
  • 之前在学习链表的过程中,笔者认为新... 看了老师的例程,发现老师定义了结构体数据类型之后,在main()函数中没有定义过结构体变量,而是使用结构体指针定义链表的新节点。 随后笔者做了如下测试: #include ...
  • C语言--结构体数组和结构体指针

    万次阅读 多人点赞 2018-08-16 21:06:49
    结构体是我们自己定义的一种新的数据类型, 同样可以有结构数组和结构指针。  1.结构体数组 具有相同结构体类型的变量构成的数组,称为结构体数组。与普通数值型数组的不同之处在于每个数组元素都是一个结构体变量...
  • 写测试代码的过程中我明白了,同事所说的二叉树遍历算法中所用的左子树和右子树指针不需要初始化,其实是这样的,左子树和右子树指向的必须是二叉树节点类型的结构体指针(你填一个长度相同的指针也可以),而该...
  • C语言 结构体与结构体指针用法总结

    万次阅读 多人点赞 2017-08-20 17:03:18
    C语言开发中,结构体用到的机会很多。所谓结构体,就是定义一种里面包含多种元素的变量。 我们来看一个简单的例子。比如你想定义一个书名列表然后为每本书创建书名和作者作为书的信息。结构体变量定义如下: ...
  • int * //指向整数类型的指针 float * //指向浮点数类型的指针 char * //指向字符类型的指针 int a = 5; int * p; p = &a[0]; //或者p = a; printf("%x\n",p); printf("%d\n",a); printf("%d\n",*p); 输出...
  • 一、“.”和“->”区别: 当声明一个结构体时,因为自动分配了结构体的内存空间...但如果声明的是一个结构体指针,则需要手动开辟一个结构体内存后,将这个指针指向该内存块后,再使用“->”进行内部变量访问...
  • 若有一结构体struct stu{int num,int age},指向结构体指针变量struct stu *p,定义stu1位struct stu类型变量。那么stu1.age、(*p).age、p->age是等价的。其中"->"被称为指向运算符。 ...
  • 如果定义一个结构体类型的普通变量,可以不malloc动态申请内存,CPU会为这个结构体变量分配内存 如果定义的是一个结构体指针,CPU会为这个指针开辟内存,但是此时这个大小是4(如果是32位的CPU的话),所以这个...
  • 一、结构体指针 与一般指针类似结构体也可以使用结构体指针进行引用使用。...当程序中定义了一个指向结构体变量的指针,就可以通过“指针名->成员变量名”的方式访问结构体变量的成员。 实例演示: #in...
  • ”是一个整体,它用于指向结构体子数据的指针,用来取子数据。 换种说法,如果我们在C语言定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”。 ...
  • c语言关于指针结构体和链表的总结

    千次阅读 2019-07-30 18:15:37
    c语言经过对于《c语言程序设计...这个声明说明p是指向int类型对象的指针变量 c语言要求每个指针变量只能指向一种特定类型的对象。 取地址运算符(&)和简介寻址运算符(×): &x:就是x在内存中的地址。  i...
  • C语言-结构体指针及结构体嵌套

    万次阅读 2015-10-29 20:11:13
    C语言中结构体是一种构造类型,和数组、基本数据类型一样,可以定义指向该种类型的指针。结构体指针的定义类似其他基本数据类型的定义,格式如下 struct 结构体名 * 指针名; 比如: struct person{char[20] name...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 45,402
精华内容 18,160
关键字:

c语言定义指向结构体的指针

c语言 订阅