笔记(5)

本文深入探讨了C语言中结构体的基本概念与应用,包括结构体的定义、初始化及成员访问方式等。此外,还介绍了结构体数组和结构体指针的概念,并通过实例展示了结构体在实际编程中的灵活运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二维数组:
int arr[2][3] = {{1,2,3}, {3,5,6}};
arr == &arr[0] //数组名是数组第一个元素的首地址
arr[0] == &arr[0][0];////arr[0]是第二维的数组名,arr[0][0]的地址就是以为数组的arr[0]元素

int *p = arr[0];
int *p[2] = {arr[0],arr[1]};
int (*p1)[3] = arr;

int **p = arr[0][0];

int a, b;
int *p1, *p;
p1 = &a;
p = &p1;//*p = **p1

数组指针(指针数组):
// int *p[2] = {arr[0], arr[1]}; // == p[0] == arr[0]
// int (p1)[3] = arr; // (*(p1+i)+j)

二级(重)指针例子:

void func(int **p)
{
}

int main()
{
    int a = 23, b = 33;
    int **p, *p1;
    p1 = &a;
    p = &p1;

    func(p);


    int *a;
    a = (int*)0x7fff1234;//非法地址

结构体struct
基本数据结构,数组是一种数据结构(缺点:元素单一)
结构体是一种数据结构,解决了数组里不能存放多种类型的数据这种缺陷。

struct infor        // struct infor 是标识符,必须整体使用
{
    char name[50];  // (元素)成员变量(属性)
    char is_male;
    int age;
};              // 分号坚决不能少

//这么写也行
//struct    data
{
    int a;
    float b;
    char c;
}s;  // 这个S是变量名的意思;定义类型的同时给出了结构体的变量名

struct st
{
    int a;
    float b;
    char c;
}; // 结构体类型

void set_value_func(struct st arr[], int lenth)
{
    int i = 0;

    for (i=0; i<lenth; i++)
    {
        scanf("%d", &arr[i].a);
        scanf("%f", &arr[i].b);
        scanf("%d", &arr[i].c);
    }
}

void show_infor_func(struct st arr[], int lenth)
{
    int i = 0;
    for (i=0; i<lenth; i++)
    {
        printf("%d %.2f %d\n", arr[i].a, arr[i].b, arr[i].c);
    }
}

void func(struct st *p)   // p = &s
{
    p->a = 1;
    p->b = 3.14;
    p->c = 2;
}

//定义了一个类型,占空间否?
typedef struct infor S; 


int main(void)
{
    //初始化,和数组很像,挨个进行赋值
    S s2 = {1, 2};

    printf("结构体元素:%s %d %d.\n", s2.name, s2.is_male, s2.age);

    S s3 = {1, 2, 3};
    printf("结构体元素:%s %d %d.\n", s3.name, s3.is_male, s3.age);

    S s4 = {"lk", 1};
    printf("结构体元素:%s %d %d.\n", s4.name, s4.is_male, s4.age);

    //初始化
    S s5 = {.age=27, .name="吕科"};

    printf("结构体元素:[%s] %d %d.\n", s5.name, s5.is_male, s5.age);

    // 56 只是你这个类型所占字节的大小
    printf("sizeof(S) = %d.\n", sizeof(S));
    //定义了一个结构体变量,你有变量,才会给你分配空间
    //初始化
//  S s = {"吕科", 1, 17};
    //遍历元素, 运算符(.)是专用于结构体变量访问个元素
//  printf("结构体元素:%d %d %s.\n", s.is_male, s.age, s.name);
/*
    S s1;       
    //赋值个成员变量
    //.符号访问到结构体的成员变量名
    strcpy(s1.name, "吕科");

    s1.is_male = 1;

    s1.age = 17;

    printf("结构体元素:%d %d %s.\n", s1.is_male, s1.age, s1.name);
*/



/*
    //结构体指针, 野指针
//  struct st *p;
    struct st s;

//  p = &s;
    //调用函数赋值
//  func(p);
    func(&s);

    printf("s.a = %d.\n", s.a);
*/
/*
    //结构体还有数组(结构体数组)
    struct st arr[3];

    set_value_func(arr, 3);
    show_infor_func(arr, 3);
*/
/*
    //该类型的变量
    struct st s;
    s.a = 1;
    s.b = 3.14;
    s.c = 2;
    //结构体里.号的实质
    //&s类型是struct st *
    int *p_a = (int *)&s;
    printf("*p_a = %d.\n", *p_a);

//  float *p_b = (float *)((char *)&s+4); // sizeof(char) * 4 = 4字节a
//  分析:地址值转化为数字,加上几就是几
    float *p_b = (float *)((long)&s+4);   // overlap
    printf("*p_b = %.2f.\n", *p_b);
    char *p_c = (char *)((char *)&s+8);
    printf("*p_c = %d.\n", *p_c);

    struct st s1;
    //相同结构体变量之间可以互相赋值.在C++里有个称呼叫做:赋值构造
    s1 = s;

    printf("s1.a = %d.\n", s1.a);
*/          

    return 0;
}



//结构体字节对齐
struct str1      // 7
{
    int a;       // 4
    char b;      // 1 + 1
    short c;     // 2
}s1; // 8

struct str2
{
    char a;     // 1
    char b;     // 1
            // + 2  
    int c;      // 4
}s2; // 8

struct str3         // 6
{
    int a;
    char b;
    char c;
            // + 2
}s3;  // 8

struct str4     // 10
{
    struct str1 s;  // 8
    char a;         // 1 + 1
    short b;       
}s4; // 12     

typedef struct str5     // 5
{
    int a;
    char b;
}ST, *p_ST;      // ST是struct str5的类型名,p_ST是struct str5 *类型的别名

struct str6     // 5
{
    char a;
    int b;
}S, *p = &S;        // S是struct str6的变量名, p是此结构体的指针变量名。

//默认是4字节对齐,最大的基本数据类型和这个默认值要相比较,取其小
struct str7
{
    char ab;
    int a[2];
//  char b;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值