【基础】结构体基础-声明及使用

这里主要是记录一些我学习C语言中的一些知识点或个人思考过程

1.结构体和结构体数组声明及访问

1.1 结构体声明方式及搭配使用

// 1 
//struct+标识符
//你可以类比,把struct+标识符当成int使用,即:struct+标识符==int
//我们常用:int a;同理这里:struct+标识符 a;
  struct a
    {
        int i;
        float j;
        char arr[10];
    };
//此时还未定义这种结构体的变量
//常搭配:下面使用,定义了一个变量A;
struct a A;

// 2 
//struct+标识符+末尾变量
  struct b
    {
        int i;
        float j;
        char arr[10];
    }B;
//此时在定义结构体的同时定义了这种结构体变量B
//常搭配:下面使用,定义了一个变量BB,BB和B是存储在不同的位置空间上,是相互独立的;
struct b BB;

//3 
//用typedef 进行声明定义
//常用:typedef + struct +(标识符)+尾巴上的替代变量;
//例如:
 typedef struct a
    {
        int i;
        float j;
        char arr[10];
    } B;
//或者:
  typedef struct
    {
        int i;
        float j;
        char arr[10];
    } B;
//两者是等价的,常搭配下面使用:
B name;

1.2 数组结构体指针

  数组名本身不是结构名,它是一个数组名,该数组中的每个元素都是定义结构题的结构变量

// 1 
//struct+标识符,此时还未定义这种结构体的变量
  struct a
    {
        int i;
        float j;
        char arr[10];
    };
//常搭配:下面使用,定义了一个结构体数组A;
struct a A[10];
//使用:
A[0].i = 8;

// 2 
//struct+标识符+末尾变量
  struct b
    {
        int i;
        float j;
        char arr[10];
    }B;
//此时在定义结构体的同时定义了这种结构体变量B,同时下面定义一个结构体数组BB
struct b BB[10];

//3 
//用typedef 进行声明定义
//常用:typedef + struct +(标识符)+尾巴上的替代变量;
//例如:
 typedef struct a
    {
        int i;
        float j;
        char arr[10];
    } B;
//或者:
  typedef struct
    {
        int i;
        float j;
        char arr[10];
    } B;
//两者是等价的,常搭配下面使用:
B name[10];

2.结构体指针及结构体数组指针声明及访问

2.1 声明和初始化结构体指针

  gets(),有1个输入量,字符串存储地址,有返回值,对换行输入进行丢弃

// 1
 struct a
    {
        int i;
        float j;
        char arr[10];
    } barney;
//定义结构体指针:
struct a *name;
//指针name就是指向一个结构体:
//该声明并未创建一个新的结构,但是指针name现在可以指向任意现有的
//a类型的结构。a例如,如果barney是一个a类型的结构,可以这样写:
name = &barney;
//以下等价
barney.i==name->i==(*name).i;
//.运算符比*运算符的优先级高,所以加括号

2.2 声明和初始化结构体数组指针

  和数组不同的是,结构名并不是结构的地址,因此要在结构名前面加上&运算符,在本例中,A是一个结构数组,这意味着 A[0]是一个结构。所以,要让 结构体指针ptr指向A[0],可以这样写

// 1 
//struct+标识符,此时还未定义这种结构体的变量
  struct a
    {
        int i;
        float j;
        char arr[10];
    };
 struct a *ptr;
//常搭配:下面使用,定义了一个结构体数组A;
struct a A[10];
ptr=&A[0];
//常见使用:
    ptr->i = 8;//等价于(*ptr).i=8
    (ptr + 1)->i = 9;//等价于(*(ptr+1)).i=8
    printf("%d,%d", A[0].i, A[1].i);

  顺带一提,在有些系统中,一个结构的大小可能大于它各成员大小之和。这是因为系统对数据进行校准的过程中产生了一些“缝隙”。例如,有些系统必须把每个成员都放在偶数地址上,或4的倍数的地址上。在这种系统中,结构的内部就存在未使用的“缝隙”

3.向函数传递结构体信息

3.1 传递结构体成员

   函数的参数把值传递给函数。每个值都是一个数字——可能是int类型、float类型,可能是ASCII字符码,或者是一个地址。然而,一个结构比一个单独的值复杂,所以难怪以前的C实现不允许把结构作为参数传递给函数,当前的实现已经移除了这个限制,ANSI C允许把结构作为参数使用。所以程序员可以选择是传递结构本身,还是传递指向结构的指针。如果你只关心结构中的某一部分,也可以把结构的成员作为参数

3.2 向函数传递结构体地址

  注意下列程序的写法及程序中的问题

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 把这个结构体放进main函数块中会出现什么错误?
struct founds
{
    int i;
    int j;
};

// 下面这条语句放在结构体声明上面会出现什么错误?
int summ(const struct founds *);
int main()
{
    int res = 0;

    // 为什么不写成下面的版本?会出现什么错误?
    // 是不是没有提前对其进行初始化?
    // struct founds *MONEY;
    // MONEY->i = 10;
    // MONEY->j = 20;
    // res = summ(MONEY);
    // printf("%d", res);
    // return 0;

    struct founds money;
    struct founds *MONEY;
    MONEY = &money;
    MONEY->i = 10;
    MONEY->j = 20;
    res = summ(MONEY);
    printf("%d", res);
    return 0;
}
int summ(const struct founds *a)
{
    int i = 0;
    i = (a->i + a->j);
    return i;
}

3.2 向函数传递结构体

  传递结构体,把上述的结构体指针换成结构体就可以了,不过在函数中的操作就变成了结构体的操作

4.参考链接

  参考链接:C语言结构体全

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值