标签:
【结构体】
定义结构体的两方式
<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;
标签:
原文地址:http://www.cnblogs.com/yzxk/p/4437581.html