为什么char型指针可以直接赋值而其他类型的不行呢?个人见解
来源:互联网 发布:网上挂号什么软件 编辑:程序博客网 时间:2024/05/18 01:37
转自:http://blog.csdn.net/zyw_anquan/article/details/7790708
问题陈述:
通常大家会遇到这样的问题:
char * p = "abc";可以顺利执行,而int *a = 1;确运行不了(这里指运行环境是VC,GCC竟然可以成功执行,这里我也比较迷惑)。
问题探讨:
这里都是我的个人看法:
int *a = 1;
这句话的代码从人类语言的理解上,就是给一个指针赋值并指向一个值为1的地址。但是编译器它不是人,它只知道char型的指针可以直接“赋值”,而int型的指针如果“赋值”怎么做呢?通常有两种做法:
方法一:
int j = 1;
int &r = j;
那么r中的值就为1,但是这里的r却不是我们想要的指针变量。
如果说一定要给int型指针变量赋值,我们采用:
方法二:
int i = 1;
int * a = &i;
的话,结果却是i的内存地址。怎么回事呢?在解决问题之前,我先举个例子:
我们定义为:
char *aa="abc";
char *bb="abc";
aa与bb相等吗?
和char aaa[]="abc";
char bbb[]="abc";
aaa与bbb相等吗?
这个问题的思考就能很好地理解这里的指针“赋值”问题了。
char *bb="abc";
aa与bb相等吗?
和char aaa[]="abc";
char bbb[]="abc";
aaa与bbb相等吗?
这个问题的思考就能很好地理解这里的指针“赋值”问题了。
上述例子的结果是:aa == bb true ; aaa==bbb false
这个结果从两个角度解释,
角度一(
静态存储区和栈):
char *aa="abc";
char *bb="abc";
char *bb="abc";
系统把 "123" 放在了静态存储区里,栈里放了 aa 这个指针变量,指向了 "123"这个地址。
char aaa[] = "123";
char bbb[] = "123";
是系统在栈里面放了两个字符数组变量,互相无任何关联,因此它的aaa与bbb不会相等。
char bbb[] = "123";
是系统在栈里面放了两个字符数组变量,互相无任何关联,因此它的aaa与bbb不会相等。
角度二(指针内容和地址):
aa和bb存的都是相同的指针地址。
aaa和bbb虽然都是 "abc",但地址不一样。
aaa和bbb虽然都是 "abc",但地址不一样。
问题总结:
1 0
- 为什么char型指针可以直接赋值而其他类型的不行呢?个人见解
- 为什么char型指针可以直接赋值而其他类型的不行呢?个人见解
- 为什么matlab有的函数文件可以直接运行而有的不行
- 指针的值可以直接输入赋值
- new的悬挂指针可以直接赋值
- 为什么javascript只能收到控件的事件,而普通的COM不行呢?
- 为什么类的定义中不能包含自身类型,而可以包含其自身的指针类型和引用类型
- 为什么在外网可以用域名访问我们的web服务器,而在内网则不行
- 关于指针的个人见解
- 为什么debug下可以运行,而release下不行
- char 类型指针与数组 赋值想到的
- 看到的人过来帮帮忙啊!!!纠结的触摸屏移植问题(为什么别人可以,我不行呢)
- 为什么父类指针可以指向子类反之则不行
- 为什么父类指针可以指向子类反之则不行
- 为什么父类指针可以指向子类反之则不行
- 为什么父类指针可以指向子类反之则不行
- 为什么父类指针可以指向子类反之则不行
- 为什么父类指针可以指向子类反之则不行
- Leetcode#61||Rotate List
- MySQL删除数据库某表中信息重复记录
- eclipse 动态安装插件
- MySQL架构
- 九度oj 1077
- 为什么char型指针可以直接赋值而其他类型的不行呢?个人见解
- APK防反编译技术
- Linux Samba安装配置
- HDU 5101 Select(不同集合的两个数大于k的方案数)
- 调用文档在线编辑插件(ckeditor)
- lightoj 1031 - Easy Game
- NBUT 1219 Time(三维数组)
- android View/ViewGroup 的生命周期总结笔记
- 青蛙跳台阶