当前位置:网站首页 > 技术博客 > 正文

c语言结构体指针怎么用

结构体指针,可细分为

指向结构体变量的指针

指向结构体数组的指针


前面我们通过“结构体变量名.成员名”的方式引用结构体变量中的成员,除了这种方法之外还可以使用指针。



前面讲过,&student1 表示结构体变量 student1 的首地址,即 student1 第一个项的地址。如果定义一个指针变量 p 指向这个地址的话,p 就可以指向结构体变量 student1 中的任意一个成员。



那么,这个指针变量定义成什么类型呢?只能定义成结构体类型,且指向什么结构体类型的结构体变量,就要定义成什么样的结构体类型。比如指向 struct STUDENT 类型的结构体变量,那么指针变量就一定要定义成 struct STUDENT* 类型。



下面将前面的程序用指针的方式修改一下:

输出结果是:


name : 小明


birthday : 1989-3-29


num :


score : 100.0



我们看到,用指针引用结构体变量成员的方式是:

注意,*p 两边的括号不可省略,因为成员运算符“.”的优先级高于指针运算符“*”,所以如果 *p 两边的括号省略的话,那么 *p.num 就等价于 *(p.num) 了。



从该程序也可以看出:因为指针变量 p 指向的是结构体变量 student1 第一个成员的地址,即字符数组 name 的首地址,所以 p 和 (*p).name 是等价的。



但是,“等价”仅仅是说它们表示的是同一个内存单元的地址,但它们的类型是不同的。指针变量 p 是 struct STUDENT* 型的,而 (*p).name 是 char* 型的。所以在 strcpy 中不能将 (*p).name 改成 p。用 %s 进行输入或输出时,输入参数或输出参数也只能写成 (*p).name 而不能写成 p。



同样,虽然 &student1 和 student1.name 表示的是同一个内存单元的地址,但它们的类型是不同的。&student1 是 struct STUDENT* 型的,而 student1.name 是 char* 型的,所以在对 p 进行初始化时,“p=&student1;”不能写成“p=student1.name”。因为 p 是 struct STUDENT* 型的,所以不能将 char* 型的 student1.name 赋给 p。



此外为了使用的方便和直观,用指针引用结构体变量成员的方式:

可以直接用:

来代替,它们是等价的。“->”是“指向结构体成员运算符”,它的优先级同结构体成员运算符“.”一样高。p->num 的含义是:指针变量 p 所指向的结构体变量中的 num 成员。p->num 最终代表的就是 num 这个成员中的内容。



下面再将程序用“->”修改一下:

输出结果是:


name : 小明


birthday : 1989-3-29


num :


score : 100.0



但是要注意的是,只有“指针变量名”后面才能加“->”,千万不要在成员名如 birthday 后面加“->”。


综上所述,以下 3 种形式是等价的:

  • 结构体变量.成员名。
  • (*指针变量).成员名。
  • 指针变量->成员名。


其中第 3 种方式很重要,通常都是使用这种方式,另外两种方式用得不多。后面讲链表的时候用的也都是第 3 种方式。


在前面讲数值型数组的时候可以将数组名赋给一个指针变量,从而使该指针变量指向数组的首地址,然后用指针访问数组的元素。结构体数组也是数组,所以同样可以这么做。



我们知道,结构体数组的每一个元素都是一个结构体变量。如果定义一个结构体指针变量并把结构体数组的数组名赋给这个指针变量的话,就意味着将结构体数组的第一个元素,即第一个结构体变量的地址,也即第一个结构变量中的第一个成员的地址赋给了这个指针变量。比如:


此时指针变量 p 就指向了结构体数组的第一个元素,即指向 stu[0]。我们知道,当一个指针指向一个数组后,指针就可以通过移动的方式指向数组的其他元素。



这个原则对结构体数组和结构体指针同样适用,所以 p+1 就指向 stu[1] 的首地址;p+2 就指向 stu[2] 的首地址……所以只要利用 for 循环,指针就能一个个地指向结构体数组元素。



同样需要注意的是,要将一个结构体数组名赋给一个结构体指针变量,那么它们的结构体类型必须相同。



下面编写一个程序:

输出结果是:


name:小红; age:22; sex:F; num:Z


name:小明; age:21; sex:M; num:Z


name:小七; age:23; sex:F; num:Z



此外同前面“普通数组和指针的关系”一样,当指针变量 p 指向 stu[0] 时,p[0] 就等价于 stu[0];p[1] 就等价于 stu[1];p[2] 就等价于 stu[2]……所以 stu[0].num 就可以写成 p[0].num,其他同理。下面将上面的程序用 p[i] 的方式修改一下:


输出结果是:


name:小红; age:22; sex:F; num:Z


name:小明; age:21; sex:M; num:Z


name:小七; age:23; sex:F; num:Z





















































  • 上一篇: 路由交换技术是干嘛的
  • 下一篇: elb实例
  • 版权声明


    相关文章:

  • 路由交换技术是干嘛的2025-08-05 22:30:05
  • 计算机程序理解2025-08-05 22:30:05
  • 快表是cache吗2025-08-05 22:30:05
  • freopen stdin2025-08-05 22:30:05
  • 操作系统汤小丹慕课版课后答案2025-08-05 22:30:05
  • elb实例2025-08-05 22:30:05
  • 完全背包问题 动态规划2025-08-05 22:30:05
  • 数字图像处理直方图均衡化的计算2025-08-05 22:30:05
  • 远程连接服务器代码2025-08-05 22:30:05
  • oracle impdp命令详解2025-08-05 22:30:05