C语言声明优先级 const char* char * const

C语言指针与声明解析
本文详细解析了C语言中指针的概念及其声明规则,包括const修饰符的作用及复杂声明表达式的理解方法。
1、先从简单的入手
const char * var和char const * var和char * const var
可以这么理解
const char var 表示var是个char类型的常量
char * var 表示var是一个指针,指向一个char
const char * var 表示var是一个指针,指向一个char,这个char是一个常量。
便于记忆:const 在*前面,表示指针指向的对象时常量
         *在const前面,表示指针本身是常量。



2、C语言声明的优先级规则,理解了这个规则,再复杂的声明表达式都可以轻松K.O.
优先级规则表

A 声明从它的名字开始读取,然后按照优先级依次读取

B 优先级从高到低的次序依次为
B.1 生命中被括号括起来的部分
B.2 后缀操作符优先级较高,()表示函数,[]表示数组

C.3 前缀操作符:*表示指向...的指针

C 如果const和volatile关键字后面紧跟着类型操作符,如intlong,它作用于类型操作符,其他
情况下,作用于它相邻的指针星号
现在,我们来分析一个相对比较复杂的表达式 int * const * (*test)();
分析过程:
1 看到变量名test,并且注意到它直接被括号括住
2 括号内是一个整体,所以,test是一个指针,指向某某对象
3 然后考虑括号外,由于后缀操作符()的优先级较高,所以选择()进行分析
4 由于后缀操作符()表示函数,所以test为一个指针,它指向一个函数,这个函数的入口参数为空,返回值暂时未知,由前面的int * const *决定
5 分析int * const * 由又向左,根据最右边的*得出返回值是一个指针,指向(int * const)
6 分析int * const,由于*在const前面,所以指针本身是常量,所以得出返回值是一个常量指针,这个指针指向一个int*
所以得出上述表达式是:test是一个函数指针,这个函数的入口参数为空,返回值是一个常量指针,它指向一个int*,也就是int类型的指针
C2440"=":无法从"const char [10]”转换为“char *” C2440 0"=":无法从"const char[3]”转换为"char *” C2440 )"=":无法从"const char[4]”转换为“char *” C2440 "=":无法从“const char [4]”"转换为"char *" C2440 "=":无法从"const char[4]”转换为“char *" C2440 )"=":无法从“const char [6]”转换为“char * C2440 )"=":无法从"const char [9]”转换为“char *” C2065 "compare_time":未声明的标识符 C2065 "freq”:未声明的标识符 C2065 "freq”:未声明的标识符 C2065 "freq":未声明的标识符 C2065 "freq”:未声明的标识符 C2065 "freq”:未声明的标识符 C2065 “freq”:未声明的标识符 C3863 不可指定数组类型”char[3]” E0513 不能将"const char*"类型的值分配到"char*"类型的实体 E0513 不能将"const char *"类型的值分配到"char *"类型的实体 E0513 不能将"const char *"类型的值分配到"char *"类型的实体 E0513 不能将"const char *"类型的值分配到"char *"类型的实体 E0513 不能将"const char *"类型的值分配到"char *"类型的实体 E0513 不能将"const char *"类型的值分配到"char *"类型的实体 E0513 不能将"const char *"类型的值分配到"char *"类型的实体 C6053 对”strncpy“的前一调用可能没有为字符串“valstr”添加字符串零终止符。 E0029 应输入表达式 E0020 未定义标识符"comparetime" E0020 未定义标识符"freq" E0020 未定义标识符"freq" E0020 未定义标识符"freq" E0137 表达式必须是可修改的左值 C2059 语法错误:”...” C6031 返回值被忽略:"sscanf"。输出正确的完整代码
10-20
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值