游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5685|回复: 19

[求助]char* 和 char[]的区别

[复制链接]

13

主题

46

帖子

52

积分

注册会员

Rank: 2

积分
52
发表于 2007-4-20 17:33:00 | 显示全部楼层 |阅读模式
各位我写了下面的代码,其中loopMove是实现字符串循环右移steps位。

我的问题是我为什么用char str[] = "abcdefg";就能实现到,如果用char* str = "abcdefg"; 就出现错误呢?它们不是都指向同一个地址吗?我知道一个是数组一个是指针,但数组名好像也是作为指针用的。请大家给我解释一下好吗?我真的对数组与指针有点混淆了。

void loopMove(char* pStr, int steps);

int main(int argc, char* argv[])
{
char str[] = "abcdefg";
//char* str = "abcdefg"; //为什么不能用char*
cout<<str<<endl;
loopMove(str, 2);

cout<<str<<endl;
return 0;
}

void loopMove(char* pStr, int steps)
{
int n = strlen( pStr ) - steps;
char tmp[24];  
memcpy( tmp, pStr + n, steps );
memcpy(pStr + steps, pStr, n );
memcpy(pStr, tmp, steps );  
}

8

主题

284

帖子

296

积分

中级会员

Rank: 3Rank: 3

积分
296
QQ
发表于 2007-4-20 18:17:00 | 显示全部楼层

Re:[求助]char* 和 char[]的区别

改成这样就能用了
char str1[] = "abcdefg";
char* str2 = "abcdefg"; //为什么不能用char*

13

主题

46

帖子

52

积分

注册会员

Rank: 2

积分
52
 楼主| 发表于 2007-4-20 19:46:00 | 显示全部楼层

Re:[求助]char* 和 char[]的区别

楼上的朋友,改成像你说的那样也是不行啊。你只改了名字,不知道有什么不同之处?

8

主题

284

帖子

296

积分

中级会员

Rank: 3Rank: 3

积分
296
QQ
发表于 2007-4-20 20:20:00 | 显示全部楼层

Re:[求助]char* 和 char[]的区别

看书吧,解释起来太费字了。

30

主题

357

帖子

388

积分

中级会员

Rank: 3Rank: 3

积分
388
QQ
发表于 2007-4-20 21:12:00 | 显示全部楼层

Re:[求助]char* 和 char[]的区别

楼主。。。
memcpy(pStr, tmp, steps );  这句的问题。
因为char* str = "abcdefg" 给的是const类型,即常量。
你LoopMove中的最后一句要修改这个常量,当然是会出错的了。。
所谓常量,即固定不变的数据。char[]是数组,里面是变量,所以你可以通过LoopMove修改他内部的值。

13

主题

46

帖子

52

积分

注册会员

Rank: 2

积分
52
 楼主| 发表于 2007-4-20 21:17:00 | 显示全部楼层

Re:[求助]char* 和 char[]的区别

谢谢楼上两位, 刚才上网找了找相关的资料,我基本明白了原因了。正如xikema所说的一个是字符常量,一个是字符数组,这就是核心区别吧。^^
[em9]

86

主题

2251

帖子

2386

积分

金牌会员

Rank: 6Rank: 6

积分
2386
QQ
发表于 2007-4-20 22:25:00 | 显示全部楼层

Re:[求助]char* 和 char[]的区别

像这样加几句:
void* ptr = &str[3];
std::cout << ptr << std::endl;
std::cout << &ptr << std::endl;

  1. int main(int argc, char* argv[])
  2. {
  3. char str[] = "abcdefg";
  4. //char* str = "abcdefg"; //为什么不能用char*
  5. void* ptr = &str[3];
  6. std::cout << ptr << std::endl;
  7. std::cout << &ptr << std::endl;
  8. cout<<str<<endl;
  9. loopMove(str, 2);

  10. cout<<str<<endl;
  11. return 0;
  12. }
复制代码

分别用char str*和char str[]编译运行
你会发现ptr所在地址和str[3](即d)
在char str*时离得较远
在char str[]时离得较近
为什么呢?
因为[]时,"abcdefg"在栈内存中
而*时,"abcdefg"在静态存储区中
在DEBUG下编译的代码里会加入大量检测异常的代码,所以会在运行时出错
而RELEASE下只要没越界操作,没发生破坏行为就不会出错(不同编译器不同)

用[]即把字符串压入栈内存
用*即拿一个指针指向静态存储区的字符串

86

主题

2251

帖子

2386

积分

金牌会员

Rank: 6Rank: 6

积分
2386
QQ
发表于 2007-4-20 22:39:00 | 显示全部楼层

Re:[求助]char* 和 char[]的区别

char* str = "abcdefg";
这里的"abcdefg"是不是一个const字符串,在实际使用中是说不清的
如果说是,那么char* str = "abcdefg";从语法上就是错误的
const char* str = "abcdefg";才在语法上对的
但这样的话就不能兼容C了,所以这是个历史遗留问题
说是问题就表现在有些编译器可以改变这里的"abcdefg"里的字符
所以现在写程序,遇到指针指向字符串常量,应该毫不犹豫的在前面加上const

13

主题

46

帖子

52

积分

注册会员

Rank: 2

积分
52
 楼主| 发表于 2007-4-21 00:52:00 | 显示全部楼层

Re:[求助]char* 和 char[]的区别

感谢funcman这么详细的讲解. 我在网络上看到的也有类似的内容,现在加深我的理解了. 现在我知道char* 和char[]定义的内容存在不同的分区了.不过有一处不是很明良,就是,你说*时,"abcdefg"在静态存储区中, 而在网络上找到一个相关的内容说*时,,"abcdefg"在常量区.

86

主题

2251

帖子

2386

积分

金牌会员

Rank: 6Rank: 6

积分
2386
QQ
发表于 2007-4-21 02:14:00 | 显示全部楼层

Re:[求助]char* 和 char[]的区别

一个意思,受某些文档资料影响,我这么叫的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 10:40

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表