聚合类型结构体
聚合数据类型:包括数组和结构 区别: 1、访问成员方式: 结构成员的个成员长度不相同,所以的结构通过名字来访问. 数组中的数据类型都相同,可以通过下标或指针来访问. 2、左右值 结构是一个标量.和其他任何标量一样,当结构名在表达式中作为右值使用时,他表示存储在结构中的值. 当它作为左值使用时,它表示结构存储的内存位置.但是当数组名在表达式中做为右值使用时,它的值是一个 指向数组第一个元素的指针.由于它的值是一个常量指针,所以数组名不能作为左值使用.
声明格式: struct tag{ member-list } variable-list 备注: 结构声明:声明时并未分配内存,在创建结构体变量时才分配内存.
首先,结构体是一个数据类型,所以结构体声明实际上就是:定义了一个名为 tag 的结构体数据类型类型,数据类型tag的使用和int、 char等基本类型的使用在声明变量时是有相同之处,同时也要注意到其不同之处。 其中:member-ist结构成员可以是:标量、数组、指针、或其他结构(不能包含自身结构类型,但是可以包含,自身指针的引用) 结构体变量对结构体变量成员操作有两种方式:结构体变量直接引用变量(x.a)和指向该结构体变量指针进行操作("->")。 variable-list:是定义的结构体变量,可以为:单个机构体变量,结构体数组,指向结构体的指针。 例一: struct tag{ int a; char b}; struct COMPLE
例二:
我们可以验证一下:
结果表明:&y==&y.a==p_tag;
注意:
结构体作为函数参数传递值。(见c和指针 结构体作为函数参数传值)
传递给函数的是结构体的指针,指针比整个结构体小很多,把它压到堆栈上的效率能提高很多。传递指针需要付出的代价是函数使用间接访问结构成员。 在许多机器中,你可以吧参数声明为寄存器变量,从而进一步提高指针的传递方案的效率。在有些机器上,这种声明在函数的其实部分还需要额外的指令, 用于把堆栈的参数(参数先传递给堆栈)复制到寄存器,共函数使用。但是,如果函数对这个指令的间接访问次数超过两三次,那么使用这种方法所节省 的时间将远远高于一条额外指令所花费的时间。 想函数传递指针的缺陷在于函数现在可以对调用程序的结构变量进行修改,如果我们不希望如此,可以在函数中使用const 关键字来防止这类修改。 现在函数原型将如; void print_receipt(register Transaction const *trans); typedef struct { char product[ PRODUCT_SIZE ]; int quantity; float unit_price; float total_amount; } Transaction; void print_receipt(Transaction trans) { printf("%sn,trans.product); printf("%d@%.2f total %.2fn",trans.quantity,trans.unit_price,trans.total_amount); } void compute_total_amount(register Transaction *trans) { trans->total_amount=trans->quantity*trans->unit_price; } compute_total_amount(¤t_trans);//调用compute_total_amount(register Transaction *trans); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |