C语言中结构体struct编写的一些要点解析
一、关于结构体的声明 struct { int i,j; }point; 说明: struct { int i,j; }p1,p2; struct { int i,j; }p3; 如果将 p1=p2 ,则ok;如果将 p1=p3 ,则编译器提示"incompatible types when assigning to type ‘struct <anonymous>' from type ‘struct <anonymous>'",两者的实际类型是不一样的。 2、显式声明一个结构体 struct node{ int i,j; }; 声明了一个结构体 struct node,如果需要声明一个它的对象,则可以这样:struct node n1; 3、用typedef来简化结构体的写法 typedefstruct { int i,j; }Node; 相当于把代码改名为Node了。以前需要这样声明"struct node n1;",现在只需要"Node n1;"。 typedef struct { int i,j; Node n1; }Node; 这段代码是错误的! typedef struct node{ int i,j; struct node *n1; }Node; 二、关于结构体的赋值 typedef struct { char *p; int i; char ch[256]; }mystr; mystr str;//声明一个变量,此时已为之分配了空间! 如前面提到的,如果这个变量声明是在全局,则"str.p等于NULL,str.i等于0,str.ch数组都是' '",为默认初始值;如果不在全局,则所有值都是"野值"。 2、手动初始化 mystr str2={"abc",2,"def"}; mystr str3={.p="abc",.ch="def"}; mystr str4={.ch[256]="def"};//error! mystr str5={.ch[10]="def"};//right! 此时,str2声明时手动赋了初值。str2.p和str2.ch赋值时的行为是不一样的!str2.p是一个字符指针,也就是将p指向常量字符串"abc"在内存中的地址;而str2.ch是一个常量字符指针(无法操作指针),代表的是字符数组,也就是将常量字符串"def"逐字符copy到ch数组里,赋值结束后,ch的值是:'d','e','f',' ',' '…… 3、赋值 mystr str6; str6.p = "abc"; 或者 mystr * pstr = & str6;//得到这个结构体变量的指针 pstr->p = "abc"; 4、动态生成结构体变量 mystr * pstr = (mystr*)malloc(sizeof(mystr)); pstr->p = "abc"; 注意,如果是动态生成的结构体变量(用到了malloc),则必须在丢弃该变量前将他的内存空间释放掉(用free)。 pstr->p = (char*)malloc(sizeof(char)*256); free(pstr->p); free(pstr); 三、结构体数组 我们知道基本数据类型的变量数组直接定义就可以分配空间了,结构体可以看作一种新类型,它也是定义声明变量之后就会自动分配空间的,结构体的数组也是这样。 struct book library[10]; 这样就定义了一个有10个book变量的数组,并且已经分配了存储空间。 结构体的数组和普通数组索引方式是一样的。 结构体数组也可以使用字面量初始化方法,如下 struct book lib[2] = { {"apue","stevens",128.0},{"cpp","prata",60.0} }; 是不是很方便了。要注意最外面的是 { ,不是 [ 哦。 对于成员是一个结构的结构体变量,同样可以使用字面量初始化,记住,只是初始化,不能用于对结构体变量的赋值哦。 四、指向结构的指针 指向结构体的指针是一个一直都没有掌握好的点,希望这里能记录好一点,加强理解。 对于指针有几个好处,第一:就像指向数组的指针比数组本身更容易操作一样,指向结构的指针通常也更容易操作; 第二:在早期的C中参数传递只能使用结构的指针;第三:很多奇妙的数据表示都是用了包含指向其他结构的指针的结构。 和数组不同,结构的名字不是该结构的地址(即单独的结构名并不是该结构地址的同义词),必须使用 & 运算符。声明一个指针的方式与一个普通变量没有什么区别: struct book *cpp; struct book c = { "c primer plus",60.1 }; cpp = &c; 假设 lib 是一个 struct book 的数组,现在用结构指针 cpp 指向 lib[0],那么根据指针的运算规则, cpp+1 会指向 lib[1]。虽然在一般的认识里面,结构体中的元素在存储器中是一次排列的,所以可以根据各个元素的大小来计算 cpp+1 与 cpp 之间的地址差多少。但是考虑到系统对存储器的对齐要求,不同的系统对齐的方式可能不一样,所以使用各个成员大小相加的方式计算结构的存储大小是不合适的。 五、访问结构的成员 这个比较简单,注意结构和指向机构的指针访问成员的方式不一样,结构本身使用 .运算符访问,而指向结构的指针则使用 -> 访问。 strcut book cpp,*pcpp; ... char *title; title = cpp.title; // title = pcpp->title; // title = (*pcpp).title; // 因为 . 的优先级比 * 高,必须要有括号 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |