Chinaunix首页 | 论坛 | 博客
  • 博客访问: 12907
  • 博文数量: 9
  • 博客积分: 320
  • 博客等级: 一等列兵
  • 技术积分: 100
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-25 17:33
文章分类

全部博文(9)

文章存档

2011年(1)

2010年(1)

2009年(7)

我的朋友
最近访客

分类: C/C++

2009-07-20 09:38:00

 
C语言的重要概念
 
 一、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[i] 或指针 int *a   a+i 指向 a[i]  
   (2)对于字符串 char s[i] 或指针 char *s   s+i 指向第 i个字符 s[i]  
   (3)对于二维数组int a[i][j]   
         *a+j 指向 a[0][j]   
         *(a+i) 指向 a[i][0]   
         *(a+i)+j 指向 a[i][j]   
      例:对于 a[2][3]={1,2,3,4,5,6,}; 有 *(*(a+1)+1)=5; 
   (4)对于字符串数组char p[i][j] 或字符型指针数组char *p[i]   
         *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[i]   
         a[i] 指向 变量i   即 *a[i]=变量i 或 a[i]=&变量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型。
阅读(339) | 评论(0) | 转发(0) |
0

上一篇:右键添加dos

下一篇:47种偏方治疗脱发

给主人留下些什么吧!~~