请问字符串指针和一维数组的区别在哪里?

gglovelxt 2007-04-04 07:33:48
char *a="abcdefg";

char a[]="abcdefg";

他们分别是怎样存储的?
编了一个程序,是更改abcdefghi的顺序的~~用上面的就出现错误~~下面就没问题~~
请高手赐教
...全文
375 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
零度方向 2011-08-23
  • 打赏
  • 举报
回复
瞌睡虫是下一个盖茨!
Eleve 2007-10-09
  • 打赏
  • 举报
回复
学习,mark一个
xlbdan 2007-04-05
  • 打赏
  • 举报
回复
char *a="abcdefg";

char a[]="abcdefg";

他们分别是怎样存储的?
编了一个程序,是更改abcdefghi的顺序的~~用上面的就出现错误~~下面就没问题~~
请高手赐教


char *a="abcdefg"是一个字符串常量,"abcdefg",8个字节,因为最后还有一个'\0',a是指向这个常量的首地址的指针. "abcdefg"是常量,也就是说,它是永远不可以被修改的.所以你用这种存储方式来更改abcdefghi的顺序当然是不行的,因为char *a="abcdefghi"之后,abcdefghi就是一个永远不能变的量,不可能被修改


char a[]="abcdefg"这是做为一个数组来存放.你可以理解为a[0]=a...a[7]='\0'这样子,它们是分离开的,也就是说,"abcdefg"这个字符串是可以修改的,并不是常量,它只是和其它数组一样而已.因此利用这种存储方式来修改你的abcdefghi的顺序当然是可以的!




awl005 2007-04-05
  • 打赏
  • 举报
回复
上面的解释都很详细了
补充一下
char *a="abcdefg"; //a指向的空间里实际存放的是"abcdefg\0"长度是8

char a[]="abcdefg"; //这个数组里实际存放的就是"abcdefg"长度是7,由于没有\0,以char*访问时就会越界
spofmy 2007-04-05
  • 打赏
  • 举报
回复
学习
orc1984 2007-04-04
  • 打赏
  • 举报
回复
總的來說對於訪問內存來說 區別不大
但数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。

  指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。指针远比数组灵活,但也更危险。
iu_81 2007-04-04
  • 打赏
  • 举报
回复
数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。

  指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。指针远比数组灵活,但也更危险。
CathySun118 2007-04-04
  • 打赏
  • 举报
回复
jixingzhong(瞌睡虫·星辰)解释的很清楚
bargio_susie 2007-04-04
  • 打赏
  • 举报
回复
虫子解释得够详细,起得够早的。
我们只有接分了。
jixingzhong 2007-04-04
  • 打赏
  • 举报
回复
关键就是 指针指向的是一个常量,
它没有把常量的内容拷贝出来,
所以只能读,不能写

数组 则是把这个常量字符串复制了一份到自己的空间中,
所以可读可写,
实际上已经和原来的 常量字符串 没有关系了 ~
jixingzhong 2007-04-04
  • 打赏
  • 举报
回复
char *a="abcdefg";
在 常量区有一个字符串 "abcdefg" ,
然后定义一个指针 a, 指针的内容为这个常量字符串的首地址。
注意,这里只是一个指针指向了 常量字符串,
所以你不能对字符串进行修改,
例如 a[i]='?' 这样的操作会出错,
但是你可以修改a:char b[10]=""; a=b; //a指向数组b首地址, OK

char a[]="abcdefg";
定义了一个数组 a ,
把 字符串"abcdefg" 【这个字符串本身在常量区】拷贝到数组中来。
这样,你可以修改 数组元素,a[i]='?' //OK
但是你不能修改数组名字地址: a=b //error !!
wangzhangyong411 2007-04-04
  • 打赏
  • 举报
回复
如果是LZ的这道题目,那当然是虫子的解释很合理的,就是数据是存在一个静态区域里的,你可以查看高质量C++编程这本书,关于内存的分布 这本书讲得比较贴切
wangzhangyong411 2007-04-04
  • 打赏
  • 举报
回复
其实确切的还不够详细,在一个CPP文件中定义char a[] = "adsf";然后在另一个CPP中声明extern char *a; 这样的话你们有试过吗,然后调用prinf 看看能否成功,或者反着看一下,定义成指针 声明成数组 其实指针跟数组的差别主要都是看编译器的,在存储上其实总的来说没很大区别,在<C专家编程>里讲得很详细
grieved 2007-04-04
  • 打赏
  • 举报
回复
虫子太牛了。学习
cjchenxi 2007-04-04
  • 打赏
  • 举报
回复
学习
yzcurry 2007-04-04
  • 打赏
  • 举报
回复
我来了
luora 2007-04-04
  • 打赏
  • 举报
回复
上面的解释得很全面,接分来了。

69,373

社区成员

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

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