c语言:C语言1

一、C语言的指针
1.指针说明
 指针是包含另一变量的地址变量。
  (1)int *p
   p是一个指针,指向一个整形数。
  (2)int *p()
   p是一个函数,该函数返回一个指向整数的指针。
  (3)int (*p)()
   p是一个指针,该指针指向一个函数,这个函数返回一个整数。
  (4)int *p[]
   p是一个数组,该数组的每一个元素是指向整数的指针。
  (5)int (*p)[]
   p是一个指针,该指针指向一个数组,这个数组的每一个元素是一个整数。
  (6)int *(*p)()
   p是一个指针,该指针指向一个函数,这个函数返回一个指向整数的指针。
2.指针的初始化(赋地址)
  (1)通过符号&取变量(包括结构变量、数组第一个元素)的地址赋给指针;
  (2)把数组名赋给指针;
  (3)把函数名赋给指向函数的指针;
  (4)动态分配内存
   例:struct c{double r,i;};
     struct c *p;
     p=(struct c *)malloc(sizeof(struct c));
3.指针与数组、函数的关系
 (1)对于一维数组 int a 或指针 int *a
  a+i 指向 a
 (2)对于字符串 char s 或指针 char *s
  s+i 指向第 i个字符 s
 (3)对于二维数组int a [j]
  *a+j 指向 a[0][j]
  *(a+i) 指向 a [0]
  *(a+i)+j 指向 a [j]
  例:对于 a[2][3]={1,2,3,4,5,6,}; 有 *(*(a+1)+1)=5;
 (4)对于字符串数组char p [j] 或字符型指针数组char *p
  *p+j 指向第 0个字符串的第 j个字符
  *(p+i) 指向第 i个字符串的第 0个字符
  *(p+i)+j 指向第 i个字符串的第 j个字符
  例:对于 *p[]={"ABC","DEF"}; 有 *(*(p+1)+1)='E';
  例:对于 char p[][3]={"ABC","DEF"}; 有 *(*(p+1)+1)='E';
 (5)对于指针数组int *a
  a 指向 变量i
  即 *a =变量i 或 a =&变量i
 (6)对于结构struct XY
  {int x;int *y}*p;
  p是指向结构XY的指针
  (*p).x 或 p->x 是表示 x 的内容
  (*p).y 或 p->y 是表示指针 y 的值(地址)
  *(*p).y 或 *p->y 是表示 y 所指的内容
  &(*p).x 或 &p->x 是表示 x 的地址
 (7)指向函数的指针
  对于 void func(char *str)
       {…}; //定义了一个函数
      void (*p)(char*);//定义了一个函数指针
      p=func; //让指针指向函数
  则(*p)("…"); //用指针p可以调用函数func
 (8)指向多个不同函数的指针数组
  对于void function_1() {…};
    …
    void function_4() {…}; //定义了四个函数
    typedef void(*menu_fcn)();//定义了指向函数的指针
    menu_fcn command[4]; //定义了指针数组
    command[0]=function_1;
    …
    command[3]=function_4; //让指针数组指向四个函数
  则command[0](); //用指针数组中的一个元素调用一个函数
4.指针的分类
 (1)近指针(near):
  近指针为16位指针,它只含有地址的偏移量部分。近指针用于不超过64K 字节的单个数据段或代码段。在微、小和中编译模式下产生的数据指针是近指针(缺省状态);在微、小和中编译模式下产生的码指针(指向函数的指针)是近指针(缺省状态)。
 (2)远指针(far)
  远指针为32位指针,指针的段地址和偏移量都在指针内。可用于任意编译模式。每次使用远指针时都要重装段寄存器。远指针可寻址的目标不能超过64K ,因为远指针增减运算时,段地址不参与运算。在紧凑、大和巨模式下编译产生的数据指针是远指针(缺省状态)。
 (3)巨指针(huge)
  巨指针为32位指针,指针的段地址和偏移量都在指针内。可用于任意编译模式。远指针寻址的目标可以超过64K 。巨指针是规则化的指针。
5.指针的转换
 (1)远指针转换成巨指针
  使用以下函数
  void normalize(void far * * p)
   {
   *p=(void far *)(((long)*p&0xffff000f)+(((long)*p&0x0000fff00<<12));
   }
6.指针的使用
 (1)将浮点数转换成二进制数
  float ff=16.5;
  unsigned char *cc;
  (float*)cc=&ff;
  //此时cc的内容为"00008441"
  //即cc第一个字节=0;第二个字节=0;第三个字节=0x84;第四个字节=0x41;
 (2)将二进制数转换成浮点数
  float ff;
  unsigned char *cc;
  cc=(unsigned char*)malloc(4);
  cc=(unsigned char*)&ff;
  *(cc+0)=0;
  *(cc+1)=0;
  *(cc+2)=0x84;
  *(cc+3)=0x41;
  //此时ff=16.5
  free(cc);

二、C 语言的函数
1.用户自定义函数格式
  类型 函数名(形式参数表)
  参数说明
   {
   ……
   }
2.函数的调用方式
 (1)传值方式
  ①传给被调用函数的是整型、长整型、浮点型或双精度型变量。被调用的函数得定义相应的变量为形参。
  ②传给被调用函数的是结构变量。被调用函数得定义结构变量为形参。
  ③传给被调用函数的是结构变量的成员。被调用函数得定义与该成员同类的变量为形参。
 (2)传址方式
  ①传给被调用函数的是变量的地址。被调用函数得定义指针变量为形参。
  ②传给被调用函数的是数组的地址即数组名。被调用的函数得定义数组或指针变量为形参。
  ③传给被调用函数的是函数的地址即函数名称。被调用函数得定义指向函数的指针变量为形参。
  ④传给被调用函数的是结构的地址。被调用函数得定义结构指针为形参。
3.函数调用(传值方式)结果的返回
 (1)返回的是数值
   要求被调用的函数类型与接收返回值的变量类型相同。
 (2)返回的是指针
   要求被调用的函数是指针函数,其指向的类型与接收的指针变量指向类型相同。
 (3)不返回任何值
   被调用的函数是void型。

三、C 语言的信息压缩法
1.使用位运算符
  要把 5个数据的值压缩到一个字(16位)中,假定其中三个(f1、f2、f3)是标记(真或伪)各占一位;第四个是叫type的整数,其取值范围为 1到12,需要 4位的存储器;最后一个叫作index 的整数,其取值范围为从 0到 500,需占 9位。为此定义一个整型变量:unsigned int packed_data,可包含此 5个值。下图是位域分配。
            type    index
        f1f2f3┌——┐┌———————┐
        ┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐
        └┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┘
  把 n的 4个低位的值置入packed_data 的type域中,用下面的语句:
packed_data=(packed_data & ~(0xf<<9))|((n&0xf)<<9);
其中位或符号|左边是将type域置 0,右边是取 n的低 4位后左移9 位到type域中。
  从packed_data 的type域中提取数值并把它赋予 n的语句是:
n=(packed_data>>9) & 0xf;
2.使用位域结构
 (1)定义一个叫做 packed_struct的结构,含有 5个成员
  struct packed_struct
   {
   unsigned int f1:1
   unsigned int f2:1;
   unsigned int f3:1;
   unsigned int type:4;
   unsigned int index:9;
   };
  (注:在结构中还可以放入普通数据类型,如char c;等)
 (2)定义一个变量
  struct packed_struct packed_data;
 (3)把packed_data 的type 域置于n的低位,用语句
   packed_data.type=n;
 (4)从packed_data 中提取type域(按要求,把它移到低位),并把它赋予 n,用语句
   n=packed_data.type;
3.使用联合
 (1)一个无符号整型数与一个结构(其中包含许多无符号变量)共用一存储区,当无符号整型数被赋值后,可通过结构变量获得各位的值。
  例如,定义一个联合
  union {
  unsigned equi;
  struct {
   unsigned boot :1;
   unsigned copr :1;
   unsigned rsize:2;
   unsigned vmode:2;
   unsigned dnum :2;
   unsigned    :1;
   unsigned cnum :3;
   unsigned gnum :1;
   unsigned    :1;
   unsigned pnum :2;
   }beq;
  }eq;
  当调用BIOS INT 11H中断后,将AX的值赋给eq.equi,就可以从eq.beq.boot得到PC机有无系统盘的信息;从eq.beq.copr得到PC机有无浮点运算部件的信息。......
 (2)两个结构共享同一存储区域
  例如:union REGS
  struct WORDREGS{unsigned int ax,bx,cx,dx,si,di,cflag,flags};
  struct BYTEREGS{unsigned char al,ah,bl,bh,cl,ch,dl,dh};
  union REGS {struct WORDREGS x;struct BYTEREGS h;}
Tags:  c语言学习 c语言程序设计 c语言教程 c语言

延伸阅读

最新评论

发表评论