对于此基本结构:结构体类型是
struct datadata是自己为描述这种结构体类型而取的名字,一旦定义了一种结构体,就要为这种定义了的结构体取名字,往后所有代码,struct data实际上就是像int那样的一个类型(只是这个类型由两个中间以空格间隔的单词描述),为方便起见,往往用typedef简化(详见后文) 通常在函数外部声明结构类型,这样结构体就可以被位于其下行的多个函数使用。 上面是某种特殊结构体的定义,而要使用这个结构体时,应该写:
struct data today;其中today是这个结构体变量的名称,这符合c语言对于一个变量的定义 类型+名称。要是还觉得别扭,也可以这样看:
int today;这里today仍然是一个变量的名称,只是这个变量是int类型,而上面的变量类型是struct data(一个你自己定义的结构体)。
当然,你也可以同时定义多个结构体变量
struct data today,tommorrow;这样就相当于你同时建立了两个结构体变量
int a,b;int也可以这样理解 当然我们还可以定义一个结构数组,在这个数组中每一个元素都是一个特定的结构体
struct data datas[100]={{4,7,2020}};//对第一个元素(结构体)初始化,当有一个元素已经初始化了以后,其他的元素都默认初始为0 struct data datas[0].year=2020//访问方式注意,此时初始化需要两个大括号。
类似于
int a[100];在此再次重申 结构体名称和结构体变量的名称不是同一个概念! 上面的结构体中,结构体名称是data,结构体变量的名称是today
有时候可以不需要为结构体起名字,也就是一个结构体可以没有结构体名称,但一定要有结构体变量名称
struct{ int X; int y; }p1,p2;上面的结构体略去了名称,p1, p2是结构体变量的名称,这种方式并不常见,因为如果结构体没有名字,那么这种结构体只能使用一次,如上图也就只能有p1, p2两个结构体变量。 注意,下面这种写法是错误的,因为struct有成千上万种,你这样定义计算机不知道你想创建的哪种结构体。
struct p1,p2;上面的代码相当于
struct point{ int x; int y; }; struct point p1.p2;此时,对于结构体变量p1
p1.x=1; p1.y=2;这就是访问结构体成员的方法 结构体可以直接赋值,而数组不可以,比如说
struct point p2; p2=p1;这就表示
p2.x=p1.x; p2.y=p1.y;而如果你这样写
p1.x=0; p2 = p1; p2.x=1;那么此时p2中的x是1,p1中的x是0;它们是两个独立的结构体变量。
整个结构可以作为参数的值传入函数,这时候是在函数内部建立一个新的结构变量,并复制调用者的结构的值。 当函数内部,可能作为形参的结构体变量的某些参数发生了变化,但是作为实参的结构体不会改变。 比如:
struct point{ int x; int y; }; void test(struct point p) { p.x=1; p.y=1; } int main() { struct point phead; phead.x=0; phead.y=0; test(phead); printf("%d %d",phead.x,phead.y); return 0; }输出结果:
0 0若想要改变作为实参的结构体,应该这样写
struct point{ int x; int y; }; struct point test(struct point p) { p.x=1; p.y=1; return p;//必须将结构体返回 } int main() { struct point phead; phead.x=0; phead.y=0; phead=test(phead);//将返回的结构体赋值 printf("%d %d",phead.x,phead.y); return 0; }输出结果:
1 1指向结构的指针
struct point{ int x; int y; }my_point; struct point *p = &my_point; p->x=1;//常用 (*p).x=1//不常用输入
1 2输出
1 2对于一个全局变量的改变,可以在函数中直接修改,但如果要选择特定的变量,则必须要传递地址,作为函数的参数.。比如如下代码,要用同一个函数依次修改两个全局变量的值。 补充下全局变量的知识: 1.没有初始化的全局变量会得到0,指针会得到NULL值。 2.只能用编译时刻已知的值来初始化全局变量。 3.它们的初始化发生在main函数之前。
struct point{ int x; int y; }phead1,phead2;//全局变量 void test(struct point *p) { p->x=1; p->y=1; } int main() { //struct point phead; phead1.x=0; phead1.y=0; test(&phead1); test(&phead2); printf("%d %d",phead1.x,phead1.y); return 0; }输出结果
1 1但下面这种是错误的
pa->pt1->x;因为pt1不是指针
typedef 可以用来声明一个已有的数据类型的新名字,比如下面这一行是将int取了一个新名字ElementType,在下方的任何地方都可以用ElementType,代替int
typedef int ElementType;为了改善程序的可读性,我们常常在定义结构体时用typedef
typedef struct Apoint{ int x; int y; }point;即表示可以用point代替struct Apoint。 或者可以这样使用typedef,这样的定义和上面的定义等价。【注意和无名结构体区别,这里的结构体有名字point】
typedef struct { int x; int y; }point;我们可以以下面的方式直接定义变量
point a;链表的基本结构
typedef struct node{ int data; struct node *next;//指向这个结构体的指针 }Node;如有错误欢迎指出,有问题欢迎在评论区留言~