基本类型的指针赋值问题

shicheng107 2006-09-12 05:04:17
如果说下面两句可以通过编译
char* a;
a = "abcasdfasdfasdfasdfasdfasdf";
那为什么下面这两句不能?
int* m_int;
m_int = 321;
这两句呢?
double* m_double
m_double = 2.3;
如果说整数是嵌入指令的,那浮点数应该有静态地址?我想直接用2.3给m_double赋值怎么做?
m_double = &(2.3); 也不行啊。
...全文
617 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
Nash1983 2006-09-13
  • 打赏
  • 举报
回复
这是C语言的标准规定的,定义一个指针是不给其分配指向的空间,只给其分配存放一个指针的空间,但有一个且仅有的一个例外就是字符串,比如
char *p = "beijing";//合法的
char *f = 3.2f;//不合法,因为没有分配空间
shicheng107 2006-09-13
  • 打赏
  • 举报
回复
谢谢各位了,他知道了(这是朋友发的,不关我的事啊)
goodluckyxl 2006-09-12
  • 打赏
  • 举报
回复
如果说整数是嵌入指令的,那浮点数应该有静态地址?我想直接用2.3给m_double赋值怎么做?
m_double = &(2.3); 也不行啊。

浮点的2.3和其他类型除了字符串以外都是立即数
直接生成在数据总线上然后传递过去
而字符串是特殊处理的
zdqzdq 2006-09-12
  • 打赏
  • 举报
回复
一个按地址传递~
一个按值传递~~
是吗?
blue_zyb 2006-09-12
  • 打赏
  • 举报
回复
重点在于,为什么“2.3是一个浮点常量”,就没有地址,而"asdfasdfasdf"这个字符串也是常量就有地址?
--------------------------------------------------
你也提到整数是嵌入指令,为什么浮点数就不行呢?你可以跟踪一下下面两行代码的汇编:
int a = 10;
float b = 10.1;

下面是我在VC6.0下得到的结果:
34: int a = 10;
004012C8 mov dword ptr [ebp-4],0Ah
35: float b = 10.1;
004012CF mov dword ptr [ebp-8],4121999Ah
也就是说,编译器把浮点数嵌入指令了,为什么不呢?因为它可以按照IEEE浮点数表示法之类的规定来处理这个数。所以说,浮点型常量也是没有地址的。

至于为什么字符串常量又需要存储空间呢?原因在于它不是"单个的可解释的对象",你想想,如果你有char *p = "abcdef...."指向一个字符串,你是可以通过下标表示法p[i]来访问这些字符的。那除了把这些字符都存在一个特定的位置,并把字符串的首地址记录下来以备访问,你还能想到其他好办法吗?:)
Jokar 2006-09-12
  • 打赏
  • 举报
回复
再接上
这样做是有原因的~比如 你想用printf输出一个常量;
我们分两种情况好了
1。输出字符串常量:像printf("%s", "asdfasdfasdf");你应该知道参数传递中"asdfasdfasdf"(字符串)是传递自己的首地址给函数printf的,试想如果编译器不自动为"asdfasdfasdf"分配空间
那么传递"asdfasdfasdf"有意义吗?在函数中形式参数获得不到字符串的地址,你对"asdfasdfasdf"不能做任何操作。

2。输出浮点常量:如printf("%2.1f", 2.3);这种情况下参数采用拷贝传值,2.3将被赋予形式参数(也就是说, 一个变量),printf内形式参数中包含浮点数2.3这个值~就可以使用了~

以上
Jokar 2006-09-12
  • 打赏
  • 举报
回复
接上

再者,我说过了编译器会自动给字符串常量分配空间的:
即使你写这样单独一个语句:"asdfasdfasdf";字符串也是被分配了空间的;
但是如果你这样写:2.3;编译器不会为常量2.3分配空间的~
Jokar 2006-09-12
  • 打赏
  • 举报
回复
楼上的都没答到重点。
重点在于,为什么“2.3是一个浮点常量”,就没有地址,而"asdfasdfasdf"这个字符串也是常量就有地址?
=======================================
XD~2.3的地址是取不到了~还是别这样用吧~
把2.3赋给个浮点形态的变量然后再取地址吧~
至于"asdfasdfasdf"这个字符串,C对字符串常量就是这样特殊处理的~想通了就好了~
lj860603 2006-09-12
  • 打赏
  • 举报
回复
补充下,偶上面说的“(存储于静态区域中的某个地址)”是指字符串常量。
晨星 2006-09-12
  • 打赏
  • 举报
回复
字面字符串的右值就是个地址。
lj860603 2006-09-12
  • 打赏
  • 举报
回复
为什么“2.3是一个浮点常量”,就没有地址,而"asdfasdfasdf"这个字符串也是常量就有地址?
==========================
2.3是一个浮点常量,并不是说没有地址啊,只是不知道2.3这个数究竟存储在什么地方。
编译器能报错还好呢。要是没有错误而2.3的位置是个合法地址并存储有其他重要信息,那这个地址的内容就被改啦。
关于字符串常量那个就象尾巴说的道理一样,数组名是个指针常量(存储于静态区域中的某个地址),另一个指针指向这个指针常量并没有问题。
shicheng107 2006-09-12
  • 打赏
  • 举报
回复
楼上的都没答到重点。
重点在于,为什么“2.3是一个浮点常量”,就没有地址,而"asdfasdfasdf"这个字符串也是常量就有地址?
jixingzhong 2006-09-12
  • 打赏
  • 举报
回复
char* a;
a = "abcasdfasdfasdfasdfasdfasdf";
====================
这样的做法是不合理的,
操作的结果将是 指针被指向了 一个常量串首地址。
即是你确实需要使用常量串,
使用这样的方式也是不合适的。
(虽然不会发生错误,但是...)

char* a = (char *)malloc(100 * sizeof(char));
strcpy(a ,"abcasdfasdfasdfasdfasdfasdf"); //赋值拷贝函数

//对字符串,一般都不是直接赋值的,需要使用专门的字符串操作函数!!
jixingzhong 2006-09-12
  • 打赏
  • 举报
回复
int* m_int;
m_int = 321;
这两句呢?
double* m_double
m_double = 2.3;
============
int* m_int = (int *)malloc(sizeof(int));
*m_int = 321; //*解引用赋值啊

double* m_double = (double *)malloc(sizeof(double));
*m_double = 2.3;
jixingzhong 2006-09-12
  • 打赏
  • 举报
回复
类型要匹配啊 ....
tailzhou 2006-09-12
  • 打赏
  • 举报
回复
字符串字面值(字符串常量)用在表达式中,其类型是指向字符的指针(char *);


int arr[20];
int *ip=arr;的情况类似;


  • 打赏
  • 举报
回复
总感觉此人不象学过C语言。
lj860603 2006-09-12
  • 打赏
  • 举报
回复
楼主的问题应该是主要没有把指针赋值弄清楚点,要知道象 "abcasdfasdfasdfasdfasdfasdf";
这样的字符串也是一个指针啊,所以可以直接a = "abcasdfasdfasdfasdfasdfasdf";这样赋值。
而其他的类型比如上面的m_double = &(2.3);就不可以了,地址是未定义的。
Jokar 2006-09-12
  • 打赏
  • 举报
回复
这个m_int和m_double是指针,他们的值应为其他变量的地址,321和2.3并不符合要求
至于a = "abcasdfasdfasdfasdfasdfasdf";为什么可以,那时因为字符串常量自动被存储在程序静态
存储区了,将字符串首地址赋予char*的 a当然可以了;
至于m_double = &(2.3)貌似&运算符不能用于常量吧~
apricot0819 2006-09-12
  • 打赏
  • 举报
回复

int* m_int;
m_int = 321;

m_int是个指针,这不是就相当于你把地址为321的内存赋给指针m_int吗?
你认为这样行吗!!!
加载更多回复(3)

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧