免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3605 | 回复: 10
打印 上一主题 下一主题

[C++] 指针问题 [复制链接]

论坛徽章:
1
戌狗
日期:2013-10-24 17:31:55
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-08 22:34 |只看该作者 |倒序浏览
小菜鸟请教一个问题:
char * p1 = "abcd";               //ok
char * p2 = 'a';                     //error
int *   p3 = 10;                     //error

为什么会这样?难道非得这样?
char a='a';
char *p1=&a;
int   b = 10;
int *p2=&b;

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
2 [报告]
发表于 2013-12-08 22:46 |只看该作者
是啊, 常量没有地址啊。

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
3 [报告]
发表于 2013-12-08 22:47 |只看该作者
这是因为 literal constant 的类型问题。
"abcd" 是 char * 类型. 所以 char *p1 = "abcd"; // ok.
'a' 是 char 类型. 所以 char *p2 = 'a'; // error.
10 是 int 类型. 所以 char *p3 = 10; // error.


另外,
比如你写
int b = 10;
int *p2 = &b; // 这实际上等价于: int *p2;  p2 = &b;

这和写
int *p = (int *)10; // 等价于:     int *p;    p = (int *)10;
它们是有本质差别的.


关于指针的声明需要注意的事情:
int *p;
-- 这是声明了一个变量 p, 变量 p 的类型是 int * 类型.

C语言使用这种声明方式的原因是, 让声明的写法和实际使用时的写法一致.
比如 int *p; 这个声明的解读方式是, 如果对 变量 p 进行 解引用 * 运算, 得到的结果将会是 int 类型. 更明确的说: p 是 int * 类型, *p 是 int 类型.

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
4 [报告]
发表于 2013-12-08 22:51 |只看该作者
回复 2# folklore


    "abcd" 也是字面常量啊哥。是因为类型问题。 这种也只是写在初始化式中会 error, 如果是写在赋值表达式中应该就只是警告了。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
5 [报告]
发表于 2013-12-08 22:53 |只看该作者
回复 4# captivated


    此常量非彼常量。
像'a', 10这种, 是立即数。
“abc"可不可能是立即数。

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
6 [报告]
发表于 2013-12-08 23:02 |只看该作者
回复 5# folklore


    好吧。酱紫话题就被你扯到汇编码上了。问题是到汇编码之间还有编译器的转换。在编译器前端分析中编译器是通过符号表向语言使用者维护了类型概念的。所以在C语言层面看来这应该是类型不对等的问题而不是立即数能放到机器指令中而字符串不能的问题。

论坛徽章:
0
7 [报告]
发表于 2013-12-09 12:21 |只看该作者
常量没有分配地址给它!

论坛徽章:
1
戌狗
日期:2013-10-24 17:31:55
8 [报告]
发表于 2013-12-11 18:25 |只看该作者
回复 3# captivated


    int *p = (int *)10;
是不是指针的地址赋值为10?
是的话,下面的代码为什么在printf时崩溃?*p=10也奔溃

#include <stdio.h>
int main()
{
    int *p = (int *)10;
    //*p = 10;
    printf("%ld\n",*p);
    return 0;

}

论坛徽章:
1
摩羯座
日期:2013-12-19 10:04:07
9 [报告]
发表于 2013-12-11 20:52 |只看该作者
回复 4# captivated

的确是此常量 非彼 常量
不扯汇编的话
在C层面
"123"是一个数组对象
'1' 不是对象

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
10 [报告]
发表于 2013-12-12 14:20 |只看该作者
回复 1# syzxlyx


    首先你应该搞明白"abcd"的含义是什么,字符串在C中由编译器处理为以\0字符结尾的char数组,最早期的K&R C中没有const关健字也没有规定"abcd"这个字符数组的存储方式,char* p1 指向一个数组。所以char * p1 = "abcd"; 没问题,其它的初始化和赋值试图给指针赋标量值所以必然有错。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP