结构体里面的.的运用

我在学习usb驱动程序的时候发现了一下代码,我们可以在Linux-2.6.x/drivers/usb/storage/usb.c中找到这样一个结构体初始化项目: 
usb驱动设备的核心结构体

static struct usb_driver usb_storage_driver = { 
 .owner = THIS_MODULE, 
 .name = "usb-storage", 
 .probe = storage_probe, 
 .disconnect = storage_disconnect, 
 .id_table = storage_usb_ids,

}; 

第一种作用

看到这个结构体我有些没看懂,因为这不是我们一般看到的结构体的定义方式,后来查资料发现这是linux2.6内核等方式的C99标准的定义方式。举个例子:

struct book { 
  char title[MAXTITL];
  char author[MAXAUTL]; 
  float value;

};

例如上面这个结构体,我们在调用时可以:

struct book A1{ 
  char title="Rue for the Toad";
  char author="James Broadfool"; 
  float value=25.99;

};

1.这样初始化,我们都能看的懂,但在linux内核中有些结构体的定义参数比较多,而我们要实例化一个结构体但只用其中的部分参数我们不可能全部写出来初始化,所以用到了.运算符,例如

struct book A2 = { .value = 10.99 };

2.这样初始化既可以只初始化部分变量,也可以无顺序的初始化:

struct book A3 = { .value = 18.90, .author = "Philionna pestle", 0.25};

3.上面的这个初始化方式不仅用到了混序的初始化方式,后面的0.25我们在原定义中可以看出author后面的变量为value,因此0.25赋值给value,所以这个结构体初始化后value值为0.25

第二种作用

当然.运算符在结构体中也有其常用的作用 
1.最基础的当然是一个结构体实例化后的变量引用

struct book{
char*name[2012];
long price;
char*pub[32];
}CGramer;
//变量引用
CGramer book_1;
book_1.name="C++Primer";
book_1.price=129;
book_1.pub="人民邮电出版社";
### C语言中结构体与`const`关键字的使用方法及其作用 #### 结构体的基础定义 在C语言中,结构体是一种复合数据类型,允许将不同类型的多个变量组合在一起形成一个新的整体。它的基本语法形式如下[^1]: ```c struct 结构体名 { 类型 成员变量一; 类型 成员变量二; ... }; ``` #### `const`关键字的核心功能 `const`关键字的主要用途在于声明不可变的常量或者保护某些内存区域不被修改。它增强了程序的安全性和可维护性[^3]。 --- #### 将`const`应用于结构体的不同场景 ##### 场景一:结构体成员为`const` 当某个结构体成员被标记为`const`时,表示该成员一旦初始化后便不能再被更改。例如: ```c struct Student { const char* name; // 名称为只读属性 int age; }; int main() { struct Student stu = {"Alice", 20}; // 下列语句会引发编译错误,因为name是const成员 // stu.name = "Bob"; return 0; } ``` 在此例子中,`stu.name`是一个指向字符串的指针,并且由于`const`修饰符的存在,无法重新赋予新的地址值[^2]。 --- ##### 场景二:指向结构体的`const`指针 如果一个指针被声明为指向`const`结构体,则意味着通过这个指针访问到的所有结构体成员都不能被修改。下面的例子展示了如何实现这一点: ```c #include <stdio.h> struct Point { int x; int y; }; void printPoint(const struct Point* ptr) { printf("(%d, %d)\n", ptr->x, ptr->y); // 下列语句会产生编译错误,因ptr是指向const对象的指针 // ptr->x = 10; } int main() { struct Point p = {5, 7}; printPoint(&p); return 0; } ``` 在这个函数内部尝试改变`ptr->x`将会失败,原因是参数传递的是一个指向不变(`const`)结构体实例的指针[^2]。 --- ##### 场景三:整个结构体作为`const` 还可以把整个结构体设置成`const`状态,这意味着任何试图修改此结构体内任一部分的行为都会遭到阻止。 ```c const struct Date today = {2023, 9, 28}; // 修改today中的字段会导致编译期报错 // today.year = 2024; printf("Today's date is %d-%d-%d.\n", today.year, today.month, today.day); ``` 这定义了一个名为`Date`的结构体并将其设为了全局范围内的恒定值。 --- ### 总结 - **结构体**提供了一种机制用于封装多种类型的数据项; - **`const`关键字**则提供了额外一层保障——无论是单独的数据还是复杂的数据集合都可以指定它们的状态为不可变更从而提高软件质量。 以上就是关于C语言结构体以及`const`关键词的一些基础介绍连同实际运用案例分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值