指针与数组的不同之处

[复制链接]
 楼主| 16777216 发表于 2013-6-22 09:53 | 显示全部楼层 |阅读模式
本帖最后由 16777216 于 2013-6-22 10:17 编辑

大侠们  

char *one ="hello";
char two[20]="hello";


这两句话哪里不同 ,变量名字不同我是知道了
我记得看过一篇**  好像是说@tyw @Ryanhsiung @mohanwei @chunyang @BrawnPeas
              one指向的是一个静态的不可变的存储空间 ,内容为hell0  
               two是开辟了一个地址空间和一个存储空间  是这样么


stract(one,"word");//错误              求分析  
stract(two,"word");//正确                              不过在keil里面好像没报错,串口也能正确发送信息






Ryanhsiung 发表于 2013-6-22 12:18 | 显示全部楼层
char *one ="hello";   "hello" 放在了FLASH中
char two[20]="hello";  "hello"放在了RAM中

这样你就知道为什么下面错的原因了吧
Ryanhsiung 发表于 2013-6-22 12:18 | 显示全部楼层
可以这么说  char *one ="hello";   等效  const char two[20]="hello";  
renwocai 发表于 2013-6-22 23:03 | 显示全部楼层
可以这么说  char *one ="hello";   等效  const char two[]="hello";  
sunhq02 发表于 2013-6-23 11:57 | 显示全部楼层
3楼说的是错的

two里面指定了 20,就会在 ram中划分一块20byte的内存
而one则不是
one在编译时,code中嵌入了一块区域,内容是hello,长度是6,属于code的数据段
而one指向这个数据段

3楼的写法,即使two被放在code里面了,也是个 20字节长的

评论

很具体 回头来看 明白了  发表于 2013-7-18 08:08
sunhq02 发表于 2013-6-23 12:07 | 显示全部楼层
4楼说的也有一些问题

即使这样看起来一模一样的数组和指针,也还是有着细微的差别
数组知道自己有多长,指针不知道
即使这样的 two[],在被初始化的时候,它的长度也会被自动设置为 6,hello\0,6个字符
而one则不知道自己指向的空间有多长

使用 sizeof求one和two的长度
two得到的是整个数组的字节数,one得到的是指针本身的字节数
sunhq02 发表于 2013-6-23 12:08 | 显示全部楼层
另外提醒一点
只有在数组的完整定义或者带长度的声明可见的时候
sizeof才能求出数组长度
mrbbsp 发表于 2013-6-23 12:33 | 显示全部楼层
关键是要了解变量及其存储的位置

char *one ="hello";   分两部分, 一部分指针one 存在ram中,可修改;另一部分数组 "hello" 放在了FLASH中,不可修改

char two[20]="hello";  "hello"放在了RAM中, two没有分配空间,只是h的地址的别名

const char three[]="hello";  "hello" 放在了FLASH中,three没有分配空间,只是h的地址的别名


用IAR msp430F149做个例子,可见 one 与它的h是分开的  ;two 和three与之对应的h是相同的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 16777216 发表于 2013-6-23 16:45 | 显示全部楼层
Ryanhsiung 发表于 2013-6-22 12:18
char *one ="hello";   "hello" 放在了FLASH中
char two[20]="hello";  "hello"放在了RAM中

我在pc上用vc6.0 printf打印运行直接出错
但是在单片机上 串口倒是能正确发送信息
 楼主| 16777216 发表于 2013-6-23 16:45 | 显示全部楼层
mrbbsp 发表于 2013-6-23 12:33
关键是要了解变量及其存储的位置

char *one ="hello";   分两部分, 一部分指针one 存在ram中,可修改;另 ...

我在pc上用vc6.0 printf打印运行直接出错
但是在单片机上 串口倒是能正确发送信息
 楼主| 16777216 发表于 2013-6-23 16:45 | 显示全部楼层
sunhq02 发表于 2013-6-23 12:07
4楼说的也有一些问题

即使这样看起来一模一样的数组和指针,也还是有着细微的差别

我在pc上用vc6.0 printf打印运行直接出错
但是在单片机上 串口倒是能正确发送信息
 楼主| 16777216 发表于 2013-6-23 16:46 | 显示全部楼层
sunhq02 发表于 2013-6-23 12:08
另外提醒一点
只有在数组的完整定义或者带长度的声明可见的时候
sizeof才能求出数组长度 ...

我再仔细理解看看
majipeng1986 发表于 2013-6-25 09:22 | 显示全部楼层
mrbbsp 发表于 2013-6-23 12:33
关键是要了解变量及其存储的位置

char *one ="hello";   分两部分, 一部分指针one 存在ram中,可修改;另 ...

有道理。。
logokfu 发表于 2013-6-26 13:36 来自手机 | 显示全部楼层
stract(&one,"word");这样改你试下楼主,看看行不行。
 楼主| 16777216 发表于 2013-6-26 13:54 | 显示全部楼层
**kfu 发表于 2013-6-26 13:36
stract(&one,"word");这样改你试下楼主,看看行不行。

不行的 直接不能编译的 one已经是地址了
logokfu 发表于 2013-6-26 13:58 | 显示全部楼层
我迷糊了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

399

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

61

主题

399

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部