C语言---结构体指针

结构体指针

-----------------------------ASP.Net+Unity开发、.Net培训、期待与您交流!-------------------------



 一.结构体
     1.什么是结构体;
      一个整体由多个数据构成时,我们可以用数组来表示这个整体,但是数组内部的每一个元素都必须是相同类型的数据。在实际应用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名、年龄、身高等数据构成,那么我们就要用到结构体;
     2.定义
     struct 结构体名
     {
         数据类型1,成员名;
         数据类型2,成员名;
         ......
     };
     例如:  struct student{
                 int age;
                 char *name;
             };
      结构体实际上就行当于我们定义一个变量类型;
     3.结构体变量名
      struct person{
         int age;
         float height;
       };
       struct person p;   先定义结构体类型,在定义变量名;
      
       struct person{
         int age;
         float height;
       }p;  定义结构体同时定义变量;
       
        struct{
         int age;
         float height;
       }p;   省略结构体类型名,直接定义变量名。
     4.结构体注意
        结构体是可以包含结构体的;
        定义结构体类型时候是没有分配存储空间的,就像int类型没有存储空间一样,只有定义结构体变量时才会分配空间存储;
        结构体存储方式是按成员名依次排列的;
        结构体如果类型相同,那么所占空间为其成员类型之和;如果不相同,那么为占最大存储空间的类型的倍数;
     5.结构体初始化
        struct person{
         int age;
         float height;
        };
       struct person p = {17,50.5};定义变量的同时初始化;
     6.结构体的使用
       struct person{
         int age;
         float height;
        };
       struct person p ;
      想访问年龄  p.age = 17;
       struct person{
         int age;
         float height;
        };
       struct person p = {17,50.5};
       struct person pp = p ; 同一类型的结构体中可以相互赋值;
二.结构体数组
     1.定义,和结构体一样3种方式;
      struct student{
          int age;
          char *name;
     };
     struct student stu[10];
      struct student{
          int age;
          char *name;
     }stup[10];
     struct{
       int age;
       char *name;
     }stup[10];
     2.初始化
    struct student{
       int age;
       char *name;
     };
    struct student  stu[2] = {{17,"zs"},{23,"sl"}};
三.结构体作为函数参数
      将结构体变量作为函数参数进行传递时,其实传递的是全部成员的值,也就是将实参中成员的值一一赋值给对应的形参成员。因此,形参的改变不会影响到实参。

四.指针

     1.定义
     指针向的数据类型 * 指针变量名;
     char *p;   int *pp;    float *ppp;
     2.指针的赋值
     int a = 10;
     int *p ;
     p = &a;  先定义,再赋值;
     int a = 10;
     int *p1 = &a; 定义的同时赋值;
     3.改值
     int a = 10;
     int *p = &a;
     *p = 5;  将a的值变为5 了;
     指针一定要初始化,否则是一个野指针,威害很大;
五.指针与数组
     1.指针与一位数组
      数组是一块连续的内存,数组元素的下标就是该元素的位置相对与数组起始地址的偏移量
      因为第一个元素的地址与数组名地址是相同的,所以便宜量是0数组就相当于一个指针,数组的变量名就是地址;
      int num[] = {1,2,5};
      int *p = num;
      遍历数组:
      for (int i = 0;i < 3;i++)
       {     printf("%d",*p);
             p++;
        }
       p + i,将不会改变变量的地址;
       p++   将改变变量的地址;
     2.数组名和指针的区别
       数组的地址还是数组的地址,指针的地址变量的地址不是指针变量里存放的地址
       数组变量的指向不可以改变
      指针变量就是就是用来存放地址变量,系统为其开辟了存储空间,所以指针变量中地址可以任意改变,但是系统没有数组变量分配存储空间,当系统编译后所有出现数组名的地方都会被替换成该数组的首地址,所以你不可改变数组变量的指向。
六.指针与字符串
      以前我们是先定义字符串,再将字符串地址给指针: char name[] = "sl";   char *p = name;
      而我们还可以:                               char *p1 = "sl";
      两种方式的区别:  第一个定义的是字符串变量;第二个定义的是字符串常量,你不能改变他; 
七.指针与函数
      1.返回指针的函数
      指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的   
      返回指针的函数的一般形式为:类型名 * 函数名(参数列表)
      2.函数指针
      定义:指向函数的指针称为函数指针,也就存放函数地址的变量就是函数指针变量;
      格式: 返回值类型 (*函数指针名称)  (参数类型,参数类型) 
      例如:  int sum(int a,int b)    指针 int (*point)(int,int)
      初始化;    point = sum;

      注意:由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)是无意义的

      作用:将函数作为参数在函数间传递

八.指针与结构体

      定义:结构体指针变量的定义形式:struct 结构体名称 *指针变量名

      例如:   struct person{

                   int age;

                   char *name;    

               }; 

                struct person stu = {11,"df"};

                struct person *p ; 定义了一个结构体指针;

                p = &stu;           将结构体地址给指针;

      访问成员:

              stu.age    stu.name

              (*p).age    (*p).name

              p->age      p->name  最常用的方式

 


         -----------------------------ASP.Net+Unity开发、.Net培训、期待与您交流!-------------------------

    

              







     














  




















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值