这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 理解C语言的声明

共3条 1/1 1 跳转至

理解C语言的声明

高工
2017-10-31 16:04:43     打赏

1.      理解C语言的声明

声明主要由声明器、类型说明符、类型限定符和存储属性组成

1.1.   声明器(declarator1)     指针

                * const volatile                * volatile                * const                * volatile const                指针的五种限定形式

2)     数组

                类型标识符[下标]

3)     函数

                类型标识符(参数列表)

1.2.   类型说明符1)     void char short int long signed unsigned float double2)     结构体struct3)     枚举enum4)     联合体union1.3.   类型限定符1)     const2)     volatile可以放在类型前面,也可以放在后面1.4.   存储属性1)     static2)     extern3)     register4)     auto5)     typedef针对标识符(名称)1.5.   声明的限制1)     非法

           函数的返回值不能为函数           函数的返回值不能为数组           数组中不能有函数           函数的参数不能为函数

2)     合法

           函数的返回值可以是函数指针                void (*func(void))(int)           函数的返回值可以是指向数组的指针                int(*func(void))[10]           数组中可以有函数指针                void (*array[10])(int)           函数的参数可以是函数指针                void func(void (*)(int))

1.6.   声明组成的优先级规则1)     从名字开始2)     优先级顺序

           声明中被括起来的部分           后缀操作符                括号()表示是一个函数                方括号[ ]表示是一个数组           前缀操作符                星号 * 表示是指向……的指针

3)     constvolatile关键字

           如果后面紧跟着类型说明符(如intlong等),则作用于类型说明符           其他情况下,作用于左边紧邻的星号 *,表示指针常量(指针不可变)

4)     整体思路

           从里往外           从右到左           一找函数           二找数组           三找指针

2.   练习题

详细解释说明如下所列的声明
  1. char *ptr;


  2. char const *ptr;


  3. const char *ptr;


  4. char * const ptr;


  5. char * const *ptr;


  6. int demo1(int);


  7. int *demo2(int);


  8. int (*demo2)(int);


  9. int (*demo3(int))(void);


  10. int (*(*demo4)(int))(void);


  11. int (*(*demo5[10])(int))(void);


  12. int (*(*(*demo6)[10])(int))(void);


  13. int (*(*(*demo7)[10])(void (*cb)(int)))(void);


  14. int (*(*(*const demo8)[10])(void (*cb)(int)))(void);


  15. int * const * (*(*demo9)[10])(void (*cb)(int));


  16. int * const * (*(*demo10)[10])(int (*(*cb)(int))[10]);


复制代码习题分步讲解:
  1. char *ptr;


  2. ptr //名称是ptr


  3. * //ptr是一个指向...的指针


  4. char //char类型的数据


  5. /*ptr是一个指向char类型数据的指针。*/


  6. char const *ptr;


  7. ptr //名称是ptr


  8. * //ptr是一个指向...的指针


  9. char const //char类型的const常量


  10. /*ptr是一个指向char类型const常量数据的指针。*/


  11. const char *ptr;


  12. ptr //名称是ptr


  13. * //ptr是一个指向...的指针


  14. const char //char类型的const常量


  15. /*ptr是一个指向char类型const常量数据的指针。*/


  16. char * const ptr;


  17. Ptr //名称是ptr,ptr是一个...


  18. * const //指向...的指针常量


  19. char //char类型数据


  20. /*ptr是一个指向char类型数据的指针常量。*/


  21. char * const *ptr;


  22. ptr //名称是ptr


  23. * //ptr是指向...的指针


  24. * const //指向...的指针常量


  25. char //char型数据


  26. /*ptr是指向一个指向char型数据的指针常量 的指针。*/


  27. int demo1(int);


  28. demo1 //名称是demo1


  29. int (int); //demo1是一个函数,参数是int,返回值int


  30. /*demo1是一个带有一个int型参数,返回值为int类型的函数。*/


  31. int *demo2(int);


  32. demo2 //名称是demo2


  33. * (int); //demo2是一个函数,参数是int,返回一个指向...的指针int //int类型数据


  34. /*demo2是一个带有一个int型参数,返回值为一个指向int类型数据的指针。*/


  35. int (*demo2)(int);


  36. demo2 //名称是demo2,demo2是一个...


  37. * //指向...的指针int ( )(int); //一个函数,参数是int,返回一个int类型数据


  38. /*demo2是一个指向函数的指针,函数有一个int类型参数,返回一个int类型数据。*/


  39. int (*demo3(int))(void);


  40. demo3 //名称是demo3


  41. * (int) //demo3是一个函数,参数是int,返回一个指向...的指针


  42. int ( )(void); //一个函数,参数是void,返回一个int类型数据


  43. /*demo3是一个带有一个int型参数,返回值为一个没有参数的函数,函数返回值为int的函数指针。*/


  44. int (*(*demo4)(int))(void);


  45. demo4 //名称是demo4


  46. * //demo4是指向...的指针


  47. *( )(int) //一个函数,参数int,返回指向...的指针


  48. int ( )(void); //一个函数,无参数,返回int


  49. /*demo4是指向一个带有一个int型参数,返回一个无参数返回值为int的函数指针的函数的指针。*/


  50. int (*(*demo5[10])(int))(void);


  51. demo5 //名称是demo5


  52. [10] //demo5是一个有10个...类型数据元素的数组


  53. * //指向...的指针


  54. *( )(int) //一个函数,参数是int,返回一个指向...的指针


  55. int ( )(void); //一个函数,无参数,返回一个int类型的数据


  56. /*demo5是一个有10个函数指针为元素的指针数组,指针数组元素指向的函数是带有一个int型参数,返回一个无参数返回值为int的函数指针的函数。*/


  57. int (*(*(*demo6)[10])(int))(void);


  58. demo6 //名称是demo6


  59. * //demo6是一个指向...的指针


  60. *( )[10] //有10个元素的数组,数组元素类型是指向...的指针


  61. *( )(int) //一个函数,参数是int,返回一个指向...的指针


  62. int ( )(void); //一个函数,无参数,返回一个int类型的数据


  63. int (*(*(*demo7)[10])(void (*cb)(int)))(void);


  64. demo7 //名称demo7


  65. * //demo7是一个指向...的指针


  66. *( )[10] //有10个元素的数组,数据元素类型是指向...的指针


  67. *( )( . . . . ) //一个函数,参数是...,返回值为一个指向...的指针


  68. *( )( * ) //一个函数,参数是一个指向...的指针,返回值为一个指向...的指针


  69. *( )(void ( )(int)) //一个函数,参数是一个指向一个函数(参数int)的指针,返回值为一个指向...的指针


  70. int ( )(void); //一个函数,无参数,返回值为int类型数据


  71. /*demo7是一个指向有10个函数指针为元素的数组的指针,指针数组元素指向的函数是以一个带一个int型参数返回为空的函数指针为参数,返回一个无参数返回值为int的函数指针的函数。*/


  72. int (*(*(*const demo8)[10])(void (*cb)(int)))(void);


  73. demo8 //名称是demo8


  74. *const //demo8是一个指向...的指针常量


  75. *( )[10] //有10个元素的数组,元素数据类型是指向...的指针


  76. *( )( . . . . . ) //一个函数,参数是...,返回值为一个指向...的指针


  77. * //一个指向...的指针


  78. void ( )(int) //一个函数,参数是int,返回void


  79. int ( )(void); //一个函数,参数是void,返回int


  80. /*demo8是一个指向有10个函数指针为元素的数组的指针常量(指针不可变),指针数组元素指向的函数是以一个带一个int型参数返回为空的函数指针为参数,返回一个无参数返回值为int的函数指针的函数。*/


  81. int * const * (*(*demo9)[10])(void (*cb)(int));


  82. demo9 //名称是demo9


  83. * //demo9是一个指向...的指针


  84. *( )[10] //有10个元素的数组,元素数据类型是指向...的指针


  85. * ( )( . . . . ) //一个函数,参数是...,返回值为一个指向...的指针


  86. * // 参数是一个指向...的指针


  87. void ( )(int) // 一个函数,参数是int,返回void


  88. * const //指向...的指针常量


  89. int //int类型数据


  90. /*demo9是一个指向有10个函数指针为元素的数组的指针,指针数组元素指向的函数,是以一个带一个int型参数返回为空的函数指针为参数,返回指向一个int类型数据的指针常量的指针。*/


  91. int * const * (*(*demo10)[10])(int (*(*cb)(int))[10]);


  92. demo10 //demo10


  93. * //demo10是一个指向...的指针


  94. *( )[10] //有10个元素的数组,元素数据类型是指向...的指针


  95. * ( )( . . . . ); //一个函数,参数是...,返回值为一个指向...的指针


  96. ( * ); // 参数是一个指向...的指针


  97. ( *( )(int) ); // 一个函数,参数是int,返回一个指向...的指针


  98. (int ( )[10]); // 一个有10个元素的数组,数组元素类型是int


  99. * const //指向...的指针常量


  100. int //int类型数据


复制代码




管理员
2017-11-01 09:03:56     打赏
2楼

谢谢楼主分享  涨姿势


专家
2017-11-01 10:02:49     打赏
3楼

指针是最强大的设计。


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]