目录
1.结构体指针与结构体变量
2.结构体指针与结构体数组
c语言其实有时候基本知识还是一样只是说换了一个名称但是所表示的含义是一样的。
结构体指针是指针的一种类型,可以指向结构体变量或者结构体数组,下面我们来探究一下结构体指针跟结构体变量的结合,以及结构体指针与结构体数组的结合。
1.结构体指针与结构体变量
下面Jack是结构体变量,p是结构体指针,以下的写法是等价的:所表示的是同一种事情,但是不同的表示方式。
Jack.number | p->number | (*p).number | p[0].number | 等价 |
Jack.weight | p->weight | (*p).weight | p[0].weight | 等价 |
Jack.x.a | p->x.a | (*p).x.a | p[0].x.a | 等价 |
Jack.n[i] | p->n[i] | (*p).n[i] | p[0].n[i] | 等价 |
注意:
1.n是结构体里面的数组名,x是结构体内的结构体;
2.如果说在结构体内有数组,那么数组名就是表示首元素地址,我们可以定义一个整型的指针q去获取到它的地址,在通过指针的偏移去初始化数组的值,也可以定义个结构体指针去偏移指针来赋值;
详细代码如下:
#include<stdio.h>
struct student //结构体标签student
{int number;int age;float weight;float high;int n[50]; struct{int a;int b; }x;
}Jack,Make;//这里初始化了两个结构体变量
int main()
{struct student *p = &Jack;//定义一个指针指向结构体变量 p = &Jack;Jack.number <==> p->number <==> (*p).number <==> p[0].numberJack.weight <==> p->weight <==> (*p).weight <==> p[0].weightJack.x.a <==> p->x.a <==> (*p).x.a <==> p[0].x.aJack.n[i] <==> p->n[i] <==> (*p).n[i] <==> p[0].n[i]
}
2.结构体指针与结构体数组
结构体指针指向一个结构体数组,表示指向该结构体数组的首元素地址,本质上的表示方式跟普通指针指向数组的表示方式差不多,但是语法不同,比如各自的格式是不一样的,但是所表达的内容是一样。
下面四种写法单独罗列出来,结构体指针的偏移就是以自己类型的字节为单位进行偏移。
可以类似对比一级指针与一维数组的互相转换。结构体指针与结构体数组在表达成员的初始化值的时候可以互相转换,可以说就是换了一个名字。
N[0].number | (p+0)->number | (*(p+0)).number | p[0].number | 等价 |
N[1].weight | (p+1)->weight | (*(p+1)).weight | p[1].weight | 等价 |
N[2]x.a | (p=2)->x.a | (*(p+2)).x.a | p[2].x.a | 等价 |
N[3].n[i] | (p+3)->n[i] | (*(p+3)).n[i] | p[3].n[i] | 等价 |
详细代码如下:
#include<stdio.h>
struct student //结构体标签student
{int number;int age;float weight;float high;int n[50]; struct{int a;int b; }x;
}Jack,Make;//这里初始化了两个结构体变量
int main()
{struct sutdent N[4];//定义了4个学生,每个学生的信息都是不一样的struct student *p = N//定义一个指针指向结构体变量 p = &Jack;表示第一个结构体变量 数组内的结构体变量是没有名称的
N[0].number <==> (p+0)->number <==> (*(p+0)).number <==> p[0].number
N[1].weight <==> (p+1)->weight <==> (*(p+1)).weight <==> p[1].weight
N[2]x.a <==> (p=2)->x.a <==> (*(p+2)).x.a <==> p[2].x.a
N[3].n[i] <==> (p+3)->n[i] <==> (*(p+3)).n[i] <==> p[3].n[i]
} N[3].n[i]这个表示的是结构体数组里面的成员是数组的元素值
总结
- 结构体指针与结构体变量的用法就是,p->变量成员
- 结构体指针与结构体数组的用法,互相转换,也可以用->加以单位进行偏移
- 结构体这块知识模块的难点可能是在名称的表示上面,我们要多熟悉这些名称和语法,多练就能学会的。
-
结构体指针指向结构体变量,需要取地址,若要访问结构体变量的成员就可以使用→;
-
结构体指针指向结构体数组,结构体数组名代表首元素地址,我们需要偏移指针到我们要修改的那一个结构体变量,因为偏移后的指针依旧是一个地址所以我们需要解引用来获取数值,再按照结构体变量访问成员的方式去修改。c语言的很多语法都是不同的名称有着相同的含义。