结构体变量访问元素

37 阅读2分钟
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct Dog {
    char name[20];  // 用字符数组,这样写可以修改数组里面的值
    int age;
    char sex;       // 'M':公, 'W':母
    void (*eat)(void);
} Dog;

void eat() {
    printf("狗狗在吃狗粮!\n");
}

定义完成后,再初始化;
void fun1() {
    //此时Dog为结构体的类型;
    Dog dog;////创建了一个结构体变量;变量里面存放的是4个结构体的内容
    
    //现在要给变量里面的内容赋值,并打印;
    // 注意数组赋值,必须定义时赋值,已经定义了 Dog dog,则不能直接赋值,(注意结构体中只能定义,不能赋值);所以需要采用strcpy()这个库函数进行赋值;
    
    strcpy(dog.name, "旺财");//这种写法是为了安全地将字符串内容复制到结构体的字符数组成员
    dog.age = 5;
    dog.sex = 'M';
    dog.eat = eat;//函数指针指向eat这个函数;

    printf("名字: %s, 年龄: %d, 性别: %c\n", dog.name, dog.age, dog.sex);
    
    dog.eat();
    //是一个函数调用,它会执行函数体中的代码(打印 "狗狗在吃狗粮!")。如果强行放入 printf,会导致语法错误:
}

定义的时候,初始化;
void fun2()
{
    // 定义时初始化
    Dog dog = {"旺财", 5, 'M', eat};
    
    // 修改成员的值 - 必须使用strcpy
    strcpy(dog.name, "金宝"); // 正确修改字符数组内容
    
    printf("%s,%d,%c\n", dog.name, dog.age, dog.sex);
   
    dog.eat();
}



int main() {
    fun1();
    fun2();
    return 0;
}

image.png

这一种写法只是将结构体中的名字的数组改为了指针;
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* 定义全局的结构体 
struct Dog
{
  char *name;        // 名字
  int age;           // 年龄
  char sex;          // M:公,W:母
  void (*eat)(void); // 吃狗粮
};
void eat()
{
  printf("狗狗在吃狗粮!\n");
}
/**
 * 方式1:先定义,再初始化
 */
void fun1()
{
  // 定义结构体变量
  struct Dog dog;
  // 给结构体变量成员赋值
  dog.name = "旺财";
  dog.age = 5;
  dog.sex = 'M';
  dog.eat = eat;
  // 访问结构体变量成员
  printf("%s,%d,%c\n", dog.name, dog.age, dog.sex);
  // 访问成员方法(函数)
  dog.eat();
}
/**
 * 方式2:定义的同时初始化
 */
void fun2()
{
  // 定义结构体变量的同时,给变量成员初始化
  struct Dog dog = {"旺财", 5, 'M', eat};
  // 修改成员的值(改变了指针的指向)
  dog.name = "金宝";
  // 访问结构体变量成员
  printf("%s,%d,%c\n", dog.name, dog.age, dog.sex);
  // 访问成员方法(函数)
  dog.eat();
}
int main(int argc, char *argv[])
{
  fun1();
  fun2();
  return 0;
}