Chinaunix首页 | 论坛 | 博客
  • 博客访问: 172618
  • 博文数量: 33
  • 博客积分: 731
  • 博客等级: 上士
  • 技术积分: 757
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-02 22:51
文章存档

2018年(1)

2017年(2)

2013年(1)

2012年(29)

我的朋友

分类: C/C++

2012-11-14 22:54:04

学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++程序设计学习与实验系统)下运

行结果竟然是一样的???我也求解!!

逻辑上分析是没错的,这点可以确信,据我理解,估计是他的

系统的问题了,是运行的环境问题了。常规下是不会这样的。

毕竟代码终归是代码,永远都有优化的余地。逻辑是自然规律

,而代码是人类编写出来的产物,是少数人写出来的代码,而

硬件设计确实整个人类运用自然规律的结果,出问题的概率比

较小。
阅读(3599) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~