【C语言学习笔记】结构体声明结构体指针 typedef嵌套的结构体初始化 详细总结

    技术2024-07-28  75

    C语言结构体详细总结

    1.结构体三种的声明方式1.1.基本方式1.2.无名结构体1.3.常见方式 2. 结构体的初始化3.结构体指针4.结构作为函数参数结构体指针作为函数参数(常用) 5.嵌套的结构体6.typedef与结构体结构体指针的广泛应用

    1.结构体三种的声明方式

    1.1.基本方式

    struct data{ int month; int day; int year; };

    对于此基本结构:结构体类型是

    struct data

    data是自己为描述这种结构体类型而取的名字,一旦定义了一种结构体,就要为这种定义了的结构体取名字,往后所有代码,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

    1.2.无名结构体

    有时候可以不需要为结构体起名字,也就是一个结构体可以没有结构体名称,但一定要有结构体变量名称

    struct{ int X; int y; }p1,p2;

    上面的结构体略去了名称,p1, p2是结构体变量的名称,这种方式并不常见,因为如果结构体没有名字,那么这种结构体只能使用一次,如上图也就只能有p1, p2两个结构体变量。 注意,下面这种写法是错误的,因为struct有成千上万种,你这样定义计算机不知道你想创建的哪种结构体。

    struct p1,p2;

    1.3.常见方式

    struct point{ int x; int y; }p1,p2;

    上面的代码相当于

    struct point{ int x; int y; }; struct point p1.p2;

    2. 结构体的初始化

    struct point{ int x; int y; }; int main() { struct point p1 = {1,2}; return 0; }

    此时,对于结构体变量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;它们是两个独立的结构体变量。

    3.结构体指针

    struct point *p = &p1;

    4.结构作为函数参数

    整个结构可以作为参数的值传入函数,这时候是在函数内部建立一个新的结构变量,并复制调用者的结构的值。 当函数内部,可能作为形参的结构体变量的某些参数发生了变化,但是作为实参的结构体不会改变。 比如:

    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//不常用

    结构体指针作为函数参数(常用)

    struct point* inputPoint(struct point *p) { scanf("%d",&(p->x)); scanf("%d",&(p->y)); } int main() { struct point *phead; struct point y={0,0}; phead=&y; inputPoint(&y); printf("%d %d",y.x,y.y); return 0; }

    输入

    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

    5.嵌套的结构体

    struct point { int x; int y; }; struct rectangle{ struct point pt1; struct point pr2; }; //如果有变量 struct rectangle r,a; struct rectangle *pa,*rp,*ap; int main() { rp=&r;//这四种访问方式等价 ap=&a; a.pr2.x; pa->pr2.x; return 0; }

    但下面这种是错误的

    pa->pt1->x;

    因为pt1不是指针

    6.typedef与结构体

    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;

    如有错误欢迎指出,有问题欢迎在评论区留言~

    Processed: 0.010, SQL: 9