如何深入掌握C语言结构体(详解)(二)

简介: 本文章主要讲解点: 结构体的声明 结构体的类型及定义和初始化 结构体成员访问 结构体传参

结构体成员的访问


结构体变量访问成员结构变量的成员是通过点操作符(.)访问的

点操作符接受两个操作数

  • 例如
struct Stu
{
   char name[20];
    int age;
};
struct Stu s;//创建变量s


s 有成员 name 和 age

struct S s;
strcpy(s.name, "zhangsan");//使用.访问name成员
s.age = 20;//使用.访问age成员

结构体指针访问指向变量的成员

当得到的是指向一个结构体的指针

则需先对指针解引用再用(.)操作符

或者'指针->成员'(指针指向对象,生动形象)

  • 例如
struct Stu
{
 char name[20];
 int age;
};
void print(struct Stu* ps)
{
 printf("name = %s   age = %d\n", (*ps).name, (*ps).age);
    //使用结构体指针访问指向对象的成员
 printf("name = %s   age = %d\n", ps->name, ps->age);
}
int main()
{
    struct Stu s = {"zhangsan", 20};
    print(&s);//结构体地址传参
    return 0;
}

结构体传参


对于传参有传值和传址之分

  • 例如
struct S
{
 int data[1000];
 int num;
};
struct S s = {{1,2,3,4}, 1000};
  • 结构体传值
1. //结构体传参
2. void print1(struct S s)
3. {
4. printf("%d\n", s.num);
5. }
  • 结构体传址


1. 
//结构体地址传参
2. void print2(struct S* ps)
3. {
4. printf("%d\n", ps->num);
5. }
1. int main()
2. {
3. print1(s);  //传结构体
4. print2(&s); //传地址
5. return 0;
6. }

其实效果都一样,两者都可以选择

but

推荐结构体传址

函数传参的时候,参数是需要压栈的,压栈会占用空间

如果传递一个结构体对象的时候,结构体过大的话

那么参数压栈的的系统开销比较大,会导致性能下降


相关文章
|
26天前
|
存储 C语言
如何在 C 语言中实现结构体的深拷贝
在C语言中实现结构体的深拷贝,需要手动分配内存并逐个复制成员变量,确保新结构体与原结构体完全独立,避免浅拷贝导致的数据共享问题。具体方法包括使用 `malloc` 分配内存和 `memcpy` 或手动赋值。
34 10
|
26天前
|
存储 大数据 编译器
C语言:结构体对齐规则
C语言中,结构体对齐规则是指编译器为了提高数据访问效率,会根据成员变量的类型对结构体中的成员进行内存对齐。通常遵循编译器默认的对齐方式或使用特定的对齐指令来优化结构体布局,以减少内存浪费并提升性能。
|
30天前
|
编译器 C语言
共用体和结构体在 C 语言中的优先级是怎样的
在C语言中,共用体(union)和结构体(struct)的优先级相同,它们都是用户自定义的数据类型,用于组合不同类型的数据。但是,共用体中的所有成员共享同一段内存,而结构体中的成员各自占用独立的内存空间。
|
30天前
|
存储 C语言
C语言:结构体与共用体的区别
C语言中,结构体(struct)和共用体(union)都用于组合不同类型的数据,但使用方式不同。结构体为每个成员分配独立的内存空间,而共用体的所有成员共享同一段内存,节省空间但需谨慎使用。
|
1月前
|
编译器 C语言 C++
C语言结构体
C语言结构体
28 5
|
1月前
|
C语言
C语言结构体链式结构之有头单链表
文章提供了一个C语言实现的有头单链表的完整代码,包括创建链表、插入、删除和打印等基本操作。
23 1
|
1月前
|
C语言
初识C语言6——结构体
初识C语言6——结构体
18 3
|
1月前
|
存储 编译器 C语言
【C语言】探索结构体基础知识:简明概要
【C语言】探索结构体基础知识:简明概要
|
1月前
|
编译器 Linux C语言
C语言 之 结构体超详细总结
C语言 之 结构体超详细总结
20 0
|
1月前
|
存储 编译器 Linux
深入C语言:探索结构体的奥秘
深入C语言:探索结构体的奥秘