码迷,mamicode.com
首页 > 编程语言 > 详细

C的日记-结构体变量和结构体数组

时间:2015-04-18 17:25:08      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:

【结构体】

定义结构体的两方式
    <1>    struct student{};
        struct student a={10001,"云中",‘M‘,"北京"};
    <2>    struct student{
        }a={10001,"云中",‘M‘,"北京"};
定义结构体数组a换成a[],struct student stu[3]={{..},{..},{..}}; []中数值可以不指定


【结构体指针】

[指向结构体变量的指针]
    <1>struct student *pt;         //指针变量基类型必须与结构体变量的类型相同
    <2>struct student stu;
        struct student *p;
        p=&stu;
        printf("%d",(*p).num;    //p=&stu,*p=stu
    <3>printf("%d",p->num);        //->指向运算符表示指针变量p所指向的结构体中的成员
    综上:结构体成员的三种表达方式:<1>stu.num <2>(*p).num <3>p->num。
        #:p->num++:得到p指向的结构体变量中的成员n的值,[用完之后]再加1;
           ++p->num:得到p指向的结构体变量中的成员n的值+1,然后开始使用。


[指针是有基类型的]
    指针变量不能随便赋值,因为不同指针的基类型不同,如


    <1>基类型为int的指针变量p
        int a=2;
        int *p=&a;
         printf("%d",*(*p+1));    //输出a的地址+1(即输出a之后2个子节后)的地址内数值


     <2>基类型为一维数组的指针变量p
         char a[]={a,b,c};
         int *p=a;
         printf("%c",*(p+1));    //输出当前数组的首地址加上数组中char类型所占字节数所对应的值。


     <3>基类型为二位数组的一维指针变量p
         char a[][]={{a,b,c}{d,e,f}{g,h,i}};
         int *p=a+1;                //把第二行数组的首地址赋值给p
         printf("%c",*(*(p+1)));    //输出当前数组首地址加上一行数组所占字节数所对应的值。


     <4>基类型为二位数组的二维指针变量p
         char a[][]={{a,b,c}{d,e,f}{g,h,i}};
         int *p=*(a+1);//a[1]     //把第二行第0列地址赋值给P
         printf("%c",*(p+1));    //同一维数组


     <5>基类型为结构体变量的指针变量p
         struct student{
             int num;
             int name[20];
         }stu{10002,"test2"};
         struct student *p;
         p=&stu;                    //这里的stu就相当于普通变量,是要取地址的
         printf("%d\n,%20s\n",p->num,p->name);//输出当前地址对应的成员值


     <6>基类型为结构体数组的指针变量p
         struct student{
             int num;
             int name[20];
         }stu[2]{{10001,"test1"},{10002,"test2"}};
         struct student *p;
         p=stu;                    //把结构体首地址赋值给p
         printf("%d\n,%20s\n",(p+1)->num,(p+1)->name);//输出当前结构体首地址加上一个结构体的字节数对应值。


     <7>普通指针变量类型转换为基类型为结构体的指针变量
         struct student{
             int num;
             int name[20];
         }stu[2]{{10001,"test1"},{10002,"test2"}};
         struct student *p;
         p=(struct student *)stu[0].name;            //把结构体数组中第一个结构体的name的地址赋值给p
         printf("%20s\n",*(p+1));//输出当前结构体首地址加上一个结构体的字节数对应值,即输出了test2。


     <8>基类型为void的指针变量p
        void *p;
        int *t=(int *)p;        //想使用必须类型转换


     [注意:]结构体和结构体数组比较大的区别是:结构体变量名称只代表着所在内存区的别名,结构体数组的数组名代表这个结构体的首地址,所以在使用的时候需要结构体变量需要取地址,而结构体数组不要。


     [注意:]结构体的声明时是不分配内存空间的,而只有分配空间后才能&a(取地址);如:
         <1>    struct student{
                 int num;
                 int name[20];
             };                    //这是不分配内存空间的,只有声明无定义
         <2>    struct student{
                 int num;
                 int name[20];
             }//str{10001,"test"};        //第一种:分配内存空间,这之后可以使用 struct int *p = &str;
             //struct student str;        //第二种:依然分配内存空间,只不过未赋值,可以使用 struct int *p = &str;


         
       技术分享

 

 

 

技术分享

C的日记-结构体变量和结构体数组

标签:

原文地址:http://www.cnblogs.com/yzxk/p/4437581.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!