美文网首页
C语言结构体

C语言结构体

作者: maple_2014 | 来源:发表于2017-11-26 13:23 被阅读2次

结构是一个或多个变量的集合,这些变量可能是不同的类型,为了处理的方便而将这些变量组织在一个名字之下。

结构体基础

一个简单的结构声明如下:

struct point {
   int x;
   int y;
};
struct point p1, p2; //结构体变量声明,

可以通过p1.x, p1.y等引用成员。

结构与函数

当结构体参数作为函数参数时,是值传递。比如下面的函数并不能让p1的成员增加1,实际上addone函数没有任何作用。

void addone(struct point p)
{
   p.x ++;
   p.y ++;
}
struct point p1 = {100, 200};
addone(p1);

一个改进是通过返回值,比如:

struct point addone(struct point p)
{
   p.x ++;
   p.y ++;
   return p;
}
struct point p1 = {100, 200};
p1 = addone(p1);
#include <stdio.h> 

struct point{
   int x;
   int y;
};

void addone_01(struct point p)
{
   // 错误的实现,因为结构体作为参数是值传递
   p.x ++; 
   p.y ++; 
}

struct point addone_02(struct point p)
{
   //实现正确,但是糟糕的设计
   p.x ++; 
   p.y ++; 
   return p;
}

void addone(struct point *pp)
{
   // 实现正确,推荐设计,使用指针避免分配结构空间
   (*pp).x ++; 
   (*pp).y ++; 
}

void printptr(struct point *pp)
{
   printf("x = %d \n", pp->x);
   printf("y = %d \n", pp->y);
   printf("\n");
}

int main()
{
   struct point p = {100, 200};
   printptr(&p);

   addone_01(p); 
   printptr(&p);
  
   p = addone_02(p); 
   printptr(&p);
        
   addone(&p); 
   printptr(&p);

   return 0;
}

当传递给函数的结构很大时,推荐使用指针方式,效率更高,不会分配额外的空间。

另一个例子:

#include <stdio.h>

struct point{
   int *p1;
   int *p2;
};

void printptr(struct point *pp)
{
   printf("%d, %d\n\n", *(pp->p1), *(pp->p2));
   return;
}

int main()
{
   int a1 = 12;
   int a2 = 13;

   int b1 = 22;
   int b2 = 23;

   struct point pa;
   pa.p1 = &a1;
   pa.p2 = &a2;
   printptr(&pa);

   struct point pb;
   pb.p1 = &b1;
   pb.p2 = &b2;
   printptr(&pb);

   pa = pb;
   printptr(&pa);
   printptr(&pb);

   (*(pa.p1)) ++;
   printptr(&pa);
   printptr(&pb);

   return 0;
}

output:

12, 13

22, 23

22, 23

22, 23

23, 23

23, 23

可见,当pa=pb时,它们内部的指针变量也指向相同的地址。

相关文章

  • C语言和OC的结构体(struct)

    Struct(结构体) 1.结构体定义 2.结构体变量 3.结构体数组 4.C语言结构体指针 5.C语言共用体 6...

  • C语言结构体用法很多,坑也很多

    C语言可谓是编程界的传奇语言,历经几 十 年,依然排名前列。 本文主要说的是C语言中的结构体,结构体是C语言中重要...

  • C语言结构体

    结构体 本文介绍C语言结构体,struct 在C++中功能相对C较多,相当于类,这里暂时不讨论,本文单独讨论C语言...

  • 嵌入式学习笔记19.11.25

    c语言结构体 结构体一般定义全局变量 struct stu{//struct 定义结构体 stu 结构体名称 in...

  • 12-Go语言结构体

    结构体 结构体的基本概念 什么是结构体Go语言中的结构体几乎和C语言中的结构体一模一样都需要先定义结构体类型, 再...

  • C语言学习笔记-结构体占用内存大小的计算

    引言 结构体在C语言中虽然经常使用,但是怎么计算一个结构体占用多大的内存,很多C语言的新手都没注意过,其实C语言的...

  • 结构体与指针

    1.1 Linux C语言结构体 简介:本课程深入的讲解了C语言中,预处理是怎么回事,结构体和公用体又是如何使用及...

  • c语言中的结构体

    结构体是 C 语言主要的自定义类型方案,这篇就来认识一下结构体。 一、结构体的形态 C源程序(struct.c):...

  • 闲聊C语言结构体

    结构体是 C 语言主要的自定义类型方案,这篇就来认识一下结构体。 一、结构体的形态 C源程序(struct.c):...

  • 深入理解Runtime中的isa

    objc_object Objective-C 所有对象都是 C 语言结构体objc_object,这个结构体中包...

网友评论

      本文标题:C语言结构体

      本文链接:https://www.haomeiwen.com/subject/buskbxtx.html