打印

指针与数组的不同之处

[复制链接]
1688|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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";  

使用特权

评论回复
5
sunhq02| | 2013-6-23 11:57 | 只看该作者
3楼说的是错的

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

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

使用特权

评论回复
评论
16777216 2013-7-18 08:08 回复TA
很具体 回头来看 明白了 
6
sunhq02| | 2013-6-23 12:07 | 只看该作者
4楼说的也有一些问题

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

使用 sizeof求one和two的长度
two得到的是整个数组的字节数,one得到的是指针本身的字节数

使用特权

评论回复
7
sunhq02| | 2013-6-23 12:08 | 只看该作者
另外提醒一点
只有在数组的完整定义或者带长度的声明可见的时候
sizeof才能求出数组长度

使用特权

评论回复
8
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是相同的

419.JPG (91.15 KB )

419.JPG

使用特权

评论回复
9
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打印运行直接出错
但是在单片机上 串口倒是能正确发送信息

使用特权

评论回复
10
16777216|  楼主 | 2013-6-23 16:45 | 只看该作者
mrbbsp 发表于 2013-6-23 12:33
关键是要了解变量及其存储的位置

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

我在pc上用vc6.0 printf打印运行直接出错
但是在单片机上 串口倒是能正确发送信息

使用特权

评论回复
11
16777216|  楼主 | 2013-6-23 16:45 | 只看该作者
sunhq02 发表于 2013-6-23 12:07
4楼说的也有一些问题

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

我在pc上用vc6.0 printf打印运行直接出错
但是在单片机上 串口倒是能正确发送信息

使用特权

评论回复
12
16777216|  楼主 | 2013-6-23 16:46 | 只看该作者
sunhq02 发表于 2013-6-23 12:08
另外提醒一点
只有在数组的完整定义或者带长度的声明可见的时候
sizeof才能求出数组长度 ...

我再仔细理解看看

使用特权

评论回复
13
majipeng1986| | 2013-6-25 09:22 | 只看该作者
mrbbsp 发表于 2013-6-23 12:33
关键是要了解变量及其存储的位置

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

有道理。。

使用特权

评论回复
14
logokfu| | 2013-6-26 13:36 | 只看该作者
stract(&one,"word");这样改你试下楼主,看看行不行。

使用特权

评论回复
15
16777216|  楼主 | 2013-6-26 13:54 | 只看该作者
**kfu 发表于 2013-6-26 13:36
stract(&one,"word");这样改你试下楼主,看看行不行。

不行的 直接不能编译的 one已经是地址了

使用特权

评论回复
16
logokfu| | 2013-6-26 13:58 | 只看该作者
我迷糊了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

399

帖子

1

粉丝