c语言好难——关于形参传递中有const的情况
来源:互联网 发布:mac桌面文件夹灰色的 编辑:程序博客网 时间:2024/06/05 01:52
这是在逛论坛的时候看到的一个问题。
例1:
char *ptr;
void demo(const char* p)
{
;
}
int main(void)
{
demo(prt);
}
编译后不报错。
例2:
char *ptr[];
void demo(const char* p[])
{
;
}
int main(void)
{
demo(prt);
}
编译后报错,..\APP\main.c(37): error: #167: argument of type"char *" is incompatible with parameter of type "const char**" ,错误意为形参传递不合适。
先分析例2:
报错原因是形参与实参的指针类型不一致。
以下是原因分析,在c语言中,形参为数组时候,会退化为一维指针,所以const char* p[] 等价于 const char **p,
当 *prt[] 变量作为形参传递的时候,等价于 char **ptr,
当执行demo(ptr)的时候,实参传递给形参,等价于实参赋值给形参,即下面这条语句,
**p = **ptr;
本质上是两个指针数值的传递,但是形参是指向const char类型 的指针,而实参是指向 char p类型的指针,由于两个指针的类型不一致,报错。
然后是例1:
本质上等价于*p = *ptr;
形参p指向const char类型的变量,实参是指向char类型的变量,两种变量的类型是一致的,且满足赋值语句的限制项的要求,不报错。
这里要理解两件事情:
1、 指针是不存在限制项的;
2、 函数形参传递类同于变量初始化;
例2中的“指针指向const char 的指针”这句话里面的“const char的指针”就是指针的类型,而实参的指针类型是“指向char 的指针”,两者的类型不一致,所以报错。而例1中的是实参传递给形参,是两个变量间的赋值操作,变量是有限制项。在例1中形参为char型变量,实参也为char型变量,两者均为char型变量,满足了c语言赋值操作的一个条件,而形参,即左操作符的有const限制项,实参没有,符合c语言中的赋值操作中的左操作符需要包含右操作符的限制项的要求。(这里的参考文献请看c89中关于赋值的介绍)
关于c语言的赋值需要满足以下的要求(C89)
以上均为一家之言,如果错误,恳请斧正。
写于2017-2-6午 深圳
- c语言好难——关于形参传递中有const的情况
- 关于c语言中const的用法
- c语言中关于const的使用
- C语言好难——在头文件中定义const变量
- C语言-const的使用情况
- C语言中const有什么用途
- C语言中const有什么用途
- C/C++语言中关于const用法的总结
- C/C++语言中关于const用法的总结
- C语言中关于const与指针结合的理解
- C语言中 关于const和#define的区别心得
- c语言关于const的面试常识
- 有没有好的c语言书籍
- 【c语言】关于+1的各种情况
- C语言中const
- c语言之cgi实例——感觉写的比较好,比较有参考价值
- 关于C语言参数传递的新知
- 关于C语言传递参数的问题
- 关于memory fence
- pdf怎么删除其中一页 删除pdf页面的方法
- python 几种常用测试框架
- 互联网常用网络协议
- 双向链表
- c语言好难——关于形参传递中有const的情况
- flash导入PSD的问题
- 个人开发笔记整理
- android 动态申请权限
- iOS UITableView性能优化
- Shiro实战(三)
- js中创建对象的几种方式
- #645 – 确定当前发生更改的键(Checking for the Presence of Modifier Keys)
- Qt 报错LINK2019:无法解析的外部符号