学C语言不学结构体和指针,有个屁用;顶多写几个单片机的
裸机驱动程序。操作系统根本无法上道。
C语言:
(1):存储空间的分配问题:
对数据类型不进行存储空间的分配,只对变量进行存储空间的
分配,包括结构体变量,也会对结构体变量分配存储空间,存
储空间的大小分配是 结构体成员所有的类型和数量(成员是数
组的情况下,数组元素的多少个)累加算起来的,不管有没有
存储数据到结构体成员中,只要定义了一个结构体变量,就为
这个结构体变量分配了足额的存储空间,所以很多时候需要考
虑到存储空间的节省,恰当的使用结构体。试想一下,定义了
一个结构体变量,你这个变量是结构体的名义去定义的,那么
,这个变量是不是被赋予了你定义它的结构体的所有结构体成
员?那些结构体成员都被绑定了你所定义的变量,有点像程序
的打包一样,你没办法说分离出来一个结构体成员(你不需要
里面的一个成员),解决办法:自己复制一下你的结构体变量
,把那个成员删除了,因为你定义一个结构体,那个结构体并
不需要被分配存储空间,所以大胆的去定义吧,只有你用了这
个结构体去定义结构体变量的时候,你定义的结构体变量才需
要被分配存储空间。
(2):结构体成员的引用问题
必须了解的一些基础定义:
数组;字符型数组的范围大小!char name[20];
//20表示什么意思?,存取成“字符串”的话,是字符串的长度(
字符串中字母的个数)还是字符串的个数《里面的元素---字符
串,被当作一个整体来看待,就是一个字符型数组里面可以存
储多个(一个ASCII码值是小于char型的字符串)字符串》?注
意括号的成对,不然转晕你!记住一点;你定义的字符型数组,
就是单个的字符型的,怎么在数组中存取字符串?又怎么在一
个字符型数组中存取多个字符串?这些问题值得想一想,在字
符型数组中存取多个字符串的方法是定义成二维数组,行表示
字符串的个数,列表示字符串中字母的最大个数的字母个数。
别转晕了!别混淆了字符串和字符型!
答案:char s[5][10];表示s是可以存放5行容量为10个字符的字
符串的二维数组 gets(s[i]);这就说明了20表示一个字符串的字
符的个数,也就是问题中第一个答案(字符串的长度(字符串
中字母的个数))
先举个例子:
定义一个结构体如下:
struct student{
int num;
char name[20]; /*定义了一个数组用来存储name;数组
的大小是20个元素;可以存储一个字符串,记住:只能存储一
个字符串,除非你把你的字符串用孔哥号隔开来使用,当然了
,空格号也被算作了一个字符,并且你多个字符串的字母个数
加上空格号都不能超过19个字符,为什么是19个??因为你得
以\o来结束这个字符型数组的存储,这个结束符也算是一个字
符,所以你要计算好了再定义。这个字符串的字母个数最多就
是20,别超过了,超过了可能电脑会卡死;*/
float score;//定义了一个浮点型的结构体成员,用来存储分数,
}
(3):引用结构体变量的问题(结构体成员还有可能是结构
体,怎么引用里面的成员<成员是结构体的时候>的成员?-----
------student.birthday.month)
引用结构体变量成员(不是结构体变量,是变量里面的成员)
有如下几种方式:
(1):结构体变量名.成员名;中间有一小点;
如:student.name;
student.birthday.month
先举个例子:
struct student{
int num;
char name[];
char ***;
float score;
}Rubish;
常规的引用结构体变量如上;但是引用的时候,要注意一点了
:当引用name的时候,因为name本身就是一个数组了,数组
名就已经是地址了,输入的时候,不需要像其他的变量成员一
样(如:&Rubish.num)这样引用,只需直接写成
Rubish.name就行了,因为数组名name就是数组name里面的
元素(字符)的首地址;如:{scanf("%d %s
%c %f",&Rubish.num,Rubish.name,&Rubish.***,&Rubish.scor
e)},画蛇添足加&去引用name就像指针一样,地址被引用成
地址-------擦,乱码了;因为你把地址数出来了,二进制,不
乱码才有鬼!
至于为什么要说学了C语言不学结构体和指针就没什么多大的
意义,自己去看书去,谭浩强的书结构体那一章有教你为什么
计算机语言发展需要有结构体 ;也说明了为什么数组为什么代
替不了结构体的存在。如果可以代替的话,也就没有结构体了
。想要深入了解这些东西的话,想要深入体会结构体比数组的
优势的话,嵌入式 Linux的学习完全足以让你体会个够!
针对第三点((3)引用结构体变量的问题(结构体成员还有
可能是结构体,怎么引用里面的成员<成员是结构体的时候>的
成员?-----------student.birthday.month)
);做了实验进行比较运行结果:
正确代码: 错误代码:
#include "stdio.h" #include "stdio.h"
void main() void main()
{ {
char name[5]; //可以存储5个字符; char name[5]; //可以存储5个字符;
int i; int i;
while(1) while(1)
{ {
scanf("%s",name); scanf("%s",name);
printf("\n%s\n",name); printf("\n%s\n",&name);
} }
} }
VC++6.0(钟家民的软件C/C++程序设计学习与实验系统)下运
行结果竟然是一样的???我也求解!!
逻辑上分析是没错的,这点可以确信,据我理解,估计是他的
系统的问题了,是运行的环境问题了。常规下是不会这样的。
毕竟代码终归是代码,永远都有优化的余地。逻辑是自然规律
,而代码是人类编写出来的产物,是少数人写出来的代码,而
硬件设计确实整个人类运用自然规律的结果,出问题的概率比
较小。