有 PDF思维导图,可前往下载。
struct point{.....}p1,p2; p1=p2(将数值进行传递), 注意:数组不可以。
不可以将整体成员进行,整体的输入/输出: scanf("%s%d%c%d",p1) 错误! 只可以进行单个成员的输入与输出。 scanf("%d%d",&p1.num,&p1.num1)
可以像普通变量一样运算
注意:结构名 不属于 首地址
成员名可以与程序中的变量名同,但不是同一对象。
初始化: struct student p1={5,10} or struct student s1={.name="wangli",.sex='f'}
字符串的初始化: #include<string.h> strcpy(p1.addr, "no.2 language");
注意: 当其中一个成员未进行初始化且输出的时候,系统默认其值为0.
需要注意一点:在写完一个struct结构时,运用于main函数中的时候,要说明一下。 eg: void main(){ struct student p1;} 注意:当用到了指针的时候, 注意在main函数中的指向确认。eg: void main(){ struct student p1,*t; t=&p1;}
在struct中,指针的成员数据引用: (*p).number 或者: p->number ,要注意: 当指针的位置进行改变 例如: p+i .这个时候的引用就变成: (*(p+i)).number;
这里涉及了地址的自加自减:如果是a[5], a是常量,不可进行自加自减,即:a++ 错误!但是指向a[5]首地址的指针p可以,因为指针是一个变量!可以p++
有涉及到一个运算优先率的问题:++与-> -> 大于 ++
1. (*p)++ 2.++(*p) 3.*(p++) 4.*(++p)
struct student stu[3]={{1000,20},{2000,19},{3000,23}}; p->number++ ++p->number (*p++).number (*++p).number
结果:1.->大于++ 且为后缀++ 所以输出为 1000 2.(此时结构体中的1000变为了1001) 同理,1001 的前缀++ 所以是 1002; 3.先是 *p number ,再指针移位。 p++; 4.前缀的++p,所以为 3000.
struct 结构 表达形式: 1. struct student{}s1; 2.struct student{}; 3.(省去了 名) struct{}s1,s2;
注意: 可用符号常量 进行替换 struct student eg: #define STUDENT struct student 这时,main 函数中说明的时候: STUDENT s1,s2;
结构数组
在 struct 结构中,表达的形式和struct student{} p1,p2; 一致,在初始化的过程中:eg: struct student stu[2]={{.......},{........},{......}};
要注意:数组 a[1],a[2]. 要理解为第几组数据。在引用成员上(和上述一样):#include<string.h> struct student a[5]; a[1].number=10; strcpy(a[1].name,"xiaoming");
在结构数组中,用gets函数输入字符串: gets(a[1].name);
指针易错点:
传递参数的时候,将二元数组传递给指针,指针要写成: int (*p)[n] ----n为该二元数组的列数。
要改变指针的值,*p -------char s[5]={....}, p=s; *p="...."(正确); char *p="....",*p="..." 错误!
例如: char *s="123456",*t="456789",strcat(s,t) 错误!
注意:p+1 与 p++
前者没有改变指向,后者,改变了指向。