c语言遗漏梳理

2018-06-18 04:02:12来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

2017-06-10

如有错误理解之处还望各位大牛指正,您可以直接评论,也可直接发送问题至邮箱844159529@qq.com,愿同诸位共同探讨!小生不生感谢。

C语言中指针灵活之处正确认识 数组 函数 const 与指针的组合。

 

(一)同比其它类型  指针的特殊之处整理如下:

解读方式如: int a  ;   类型说明符   变量名; 

但是对于指针的不同之处就是 对于指针有两种解读方式,可以说指针就是墙头草,两边倒。具体使用如下;

int * a;  

解读方式一   类型说明符   变量名;   这里也就是说 int *  是类型符  a是变量。

但是这种方式会让人误会,申请多变量 int a, b, c;  但是用户按此想法会写成形如 int *   a,b,c;  所以这是错的,所以用户需注意 断开方式是 int   *a; 将*靠近变量断即可。但是意思解读 仍为 类型说明符   变量名;此时用户申请习惯是 int  *a,*b,*c;

解读方式二  1指针单元  2指针符号   3变量;  int  *  a;

2一个指针 3a  指向1指针单元 int;

解读方式三  墙头草

参考 int a;   我们把形如此例的变量   数组  函数  结构体 都看做为:  类型说明符   变量名; (除变量外都是 类型说明符)。同时带入指针的两种解读方式

由上述两种方式解释 以下特例 指针  数组  函数  的关系;

A. int  *  a[3];    数组     char  *  test( a,b);  函数      

B. int  (*a)[3]; 指针       char (* test)(a,b);指针

指针是墙头草

在没有强调的情况下 它是从左向右  上例 的A组分别 是int *    char *   是向int同理的 数据类型,  

B组由于有围墙(括号)指针倒向变量的这一侧  解读的时候 就是  一个指针  a  指向  类型 int [3]  ;  指向类型  char  (a,b);

 

关于赋值 ,指针a赋值的对象是 int 【3】类型的指针  如 int b【3】 a=&b;

函数  名称如同数组名称本身有地址特性;所以 test= 函数名称即可,不需要取地址符,加上取址符同样可以;

但是需要在赋值的过程中自我的虚拟地址化:  test= (&)函数名称; 这里的这个&,是假想的,这样更易理解后续函数的执行,这里只是方便理解,并不是真正意思。(摒弃坏的想法)

函数执行时方式有test(); 或者(*test)(); 也就说加不加星号都可执行函数,默认情况下我们调用函数不加星号,但是这里为了区分时指针所以加星号,星号去除也是对的。

不说指针 ,不管何时(正常的时候我们调用子函数从不加星号,但是你加了也不错,只是你没有尝试)。

#include <stdio.h>
typedef int (* T)(char a);
void  test(T p){
    
    T w;
    w=p;
    
    w(8);
    p(9);
    (*w)(10);
    (*p)(11);
    
}

int er(char a){
    printf("zheshi %d",a);
}


int main(void) { 
  test(&er);
   test(er);
  
    return 0;
}

上述验证代码验证了 函数名称在赋值与执行过程中取址符可有可无;

   

(二)关于const  对修饰变量 解读 也是拆分为类型说明符   变量名;

如: int const a;

      const int  a;

      const  int * a;  //指针解读 方式二  一个指针 a 指向const 修饰int型数据,也就是指针指向的对象是const修饰的 ,进一步就是无法通过指针修改数据; 对象

      int * const a; // 解读  一个指针  a,a被const修饰,指向 int型 ;  指针

 

 名称定义

函数指针

const

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:1682. [HAOI2014]贴海报

下一篇:c语言学习目标