Chinaunix首页 | 论坛 | 博客
  • 博客访问: 17360
  • 博文数量: 17
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 22
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-01 17:59
个人简介

天下没有笨人,只有不努力的人!

文章分类

全部博文(17)

文章存档

2013年(17)

我的朋友

分类: LINUX

2013-09-01 18:19:10

原文地址:c语言学习 作者:遇见0425

一:关于结构体与联合

1:关于结构
是一种把一些数据组合在一起的数据结构。
eg:
struct veg
{
int weight;
int price_per_lb;
};
参数传递:并不是从右往左,它首先尽可能的存放在寄存器中
如果int i和包含int型成员的结构提变量s在参数传递时候方式可能完全不同,
一个int型参数一般传到寄存器,而结构体参数则可能被传递到堆栈。
在结构体中放置数组
eg:struct s_tag
{
int a[100];
};
现在可以把数组当作第一等级的类型,永赋值语句拷贝整个数组,以传值调用的方式把它传递到函数,或者把它作为函数的返回类型。

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. struct s_tag
  4. {
  5. int a[100];
  6. };
  7. struct s_tag orange,lime,lemon;
  8. struct s_tag twofold(struct s_tag s)
  9. {
  10. int i;
  11. for(j=0;j<100;j++)
  12. s.a[j]*=2;
  13. return s;
  14. }
  15. int main()
  16. {
  17. int i;
  18. for(i=0;i<100;i++)
  19. lime.a[i]=1;
  20. lemon=twofold(lime);
  21. orange=lemon;
  22. for(i=0;i<100;i++)
  23. printf("%d ",orange.a[i]);
  24. printf("\n");
  25. }
2:关于联合
被成做变体结构
3:关于联合与结构的异同
(1)在结构中,每个成员依次存储
(2)在联合中,所有成员都从偏移地址0开始存储
=====在某个时刻,只有一个成员真正存储于该地址
******联合一般被用来节省空间,因为有些数据项不可能同时出现,如果存储,颇为浪费。
二:关于const

关键字const并不能把变量变为常量!在一个符号前面加上const限定符号,只是表示这个符号不能被赋值。也就是说这个值对于这个符号来说是只读的,但它并不能防止通过程序的内部方法修改它的值。const最有用的就是用它来限定函数的性惨,这样该函数将不会修改实参指针所指的数据,但其他函数可以修改。
eg:const int limit=10;
但如果:const int *limitp=&limit;
              int i=27;
              limitp=&i;
const与*的结合一般都表示:我给你一个指针,但你不能修改它!
另:const char **p与 char **argv到底相容不?
如下我们引入:
char *cp;//右操作数是一个指向没有限定符号的char指针
const char **ccp;//左操作数是一个指向有const限定的char指针
ccp=cp;//做操作符号具有右边操作数锁指向类型的限定符号(无),再加上自己的const
注意:
cp=ccp//结果错误!
由于const关键子并不真正表示常量,所以
eg:
const   int   two=2;
switch(i)
{
case 1:printf("case 1\n");
case two:printf("case 2\n");\\这句话就是错误的
}

三:对于malloc和calloc,realloc的讨论:

(1)calloc与malloc函数的作用一样,但它在返回指针之前,先将分配好的内容清空为0.calloc的"c"就是这个作用
(2)realloc函数改变了一个指针锁指向内存块的大小,可大可小,它经常会把内存拷贝到别的地方然后将指向新地址的指针返回给你。

一般malloc(strlen(str));都是错误的,而malloc(strlen(str)+1)才正确!


*加入一些小知识:
一个L的NUL用于结束一个ACSII字符串
两个L的NULL用于表示什么也不指向(空指针)

四:switch语句引发的错误:

1:switch语句存在一些问题!其中之一就是它对case的处理太放纵,除了遵守一个标准的C编译器至少允许一条switch语句中有257个case标签。例如:它还可以在switch的左花括号之后声明一些变量,从而运行一些局部存储的分配。会被很自然的接受------但是语句从匹配表达式的case开始执行!
2:switch的另一个问题是它内部的任何语句都可以加上标签,并在执行的时候跳转。这就有可能破坏程序里流的结构化。
eg:
switch(i)
{
case 5+3:do again();
case 2:printf("I loop unremittingly\n");
           goto  do again();
default:i++;
case 3:;
}
这样就意味着很多错误必须单步调试。
3:被称为“fall through”的错误
就是忘记加上break!
eg:
switch(2)
{
case 1:printf("case 1\n");
case 2:printf("case 2\n");
case 3:printf("case 3\n");
default:printf("default\n");
}
其输出的结果会是:
case 2
case 3
default
如果case语句后面忘记break,就会一次执行下去!
缺省采用了fall through的情况下97%都是错误的!

问题:break中断了什么?
break跳出的是最近的那层循环语句或者switch语句。

五:C语言声明
首先我们来看一般声明描述:
eg:char *const *(*next )()
剩余的声明                                要采取下一步                                                       结果
char *const *(*
next)()          取最左边的标识符                                          表示next是...
char *const *(*       
)()         查看标识符右边的下一个符号如果是方括号                              
                                            如果是一个左括号                                          不匹配
char  *const*(
       )()         如果左边的符号是一个左括号                          不匹配
char *const *(*        )()         如果左边的符号是*,const,volatile                指向.....的指针
char *const *(          )()         如果左边的符号是一个左括号                         遇到)转到第二步
char *const *           ()          查看标识符右边的下一个括号如果是方括号      不匹配
char *const *           ()          如果是一个左括号                                         返回...的函数
char *const *                       如果左边的符号是一个左括号                         不匹配
char *const *                       如果左边的符号是一个*,const,volatile         指向....的指针
char*const                                                                                             只读
                    char*                                                                                                      指向....的指针
char                                                                                                        表示char            拼在一起:next是一个指向函数的指针,该函数返回另外一个指针,该指针指向一个只读的指向char的指针
关于typedef:
1:它只为一种类型引入新的名字,并没有分配空间。而且它并没有引入新类型,它只是实现了为现有类型取了个不一样的名字
2:普通声明与typedef
普通声明表示“这个名字是一个指定类型的变量”
typedef关键字并不创建一个变量,而是宣称“这个名字是指定类型的同义词”


typedef int  x[10]与#define x  int[10]:
(1)首先typedef与宏的区别:可以永其他类型对宏类型名进行扩展,但是对typedef所定义的类型名不能这么做
eg:
#define peach int                                                     typedef int banana
unsigned peach i;//正确的                                         unsigned banana  j;//错误的
(2)其次,在联系的几个变量声明中,用typedef定义的类型能保证声明中所有变量均为一种类型
#define int_ptr     int  *                                               typedef char *   char_ptr
int_ptr    chalk,chese;                                                  char_ptr    bently,bools;
------->相当与:int *chalk,chese                                   ----------------------->bently,bools类型同为char *
不要为了方便而对结构体使用typedef!
阅读(386) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~