char *p和char p[]

kkndciapp 2008-06-08 09:26:24
请指教下我
我的理解是这样的:char *p=“abc”意思是使P指向常量abc,于是如果我们用*p="def"则会报错,因为常量不能修改
如果是char p[]="abc"到话是把常量“abc”常量复制到数组p,这个时候p指向的是变量的空间,于是*p='d',*(p+1)='e',*(p+2)='f'
请问大家,我这样理解正确吗?谢谢大家!
...全文
1872 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
Joe_vv 2011-09-09
  • 打赏
  • 举报
回复
对的。
xzhaoxzhao 2008-06-16
  • 打赏
  • 举报
回复
原来如此!
cheniqi210 2008-06-16
  • 打赏
  • 举报
回复
对于基本类型的输出。指针输出地址,但是指向字符串的指针已经不算是基本类型了,所以在cout上对字符串指针特意进行了重载。
xieyang0521 2008-06-15
  • 打赏
  • 举报
回复

char *p=“abc” p指向一个字符串常量,p本身是const char*
char p[]="abc" 类似于char p[]={'a','b','c',0},在此处"abc"并不代表字符串常量,它只是初始化列表的另一种写法!
treeheni 2008-06-13
  • 打赏
  • 举报
回复
我觉得lz理解没有错误。只是“复制”这个说法很不习惯,呵呵
xzhaoxzhao 2008-06-13
  • 打赏
  • 举报
回复
“cout是会根据变量的类型自动选择输出的”我要的就是这句话,我也是这么猜测的,但自己猜测的不算,要有个确证!
但类似这方面的知识,我在书上,都没看到,不知道到哪里去获得,或者有哪些书可看?
Darkneece 2008-06-13
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 xzhaoxzhao 的回复:]
void main()
{
char *p="abc";
cout < <p < <endl; //这里输出的是所指向的内容
}


void main()
{
int g=3;
int *p;
p=&g;
cout < <p < <endl; //这里输出的是地址值本身
}
为什么会这样?
[/Quote]
看我上一楼的发言
Darkneece 2008-06-13
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 xzhaoxzhao 的回复:]
这段我试了,编译通过,但是运行时,提示“该内存不能为written”?屏蔽*p='b',才没问题,输出abc,怎么会这样?
难道这段代码也有问题?
还有
int main()
{
char *p="abc";
cout < <p < <endl;
return 0;
}
cout < <*p < <endl输出a可以理解,但p不是指针吗?cout < <p < <endl输出应该是一个地址值才对(我认为应该输出a的地址值才对)啊,怎么输出abc。而且cout < <p+1 < <endl怎么输出bc,cout < <p+2 < <endl怎么输出c?初学C++很多疑惑的地方,请朋友们指点迷津
[/Quote]
第一个程序,p是变量,可以任意操作,当然编译上没有任何问题。但是"abc"运行后存贮位置是在常量区,该是不能被写得,所以程序运行到这一行,该操作会被操作系统阻止。

第二个程序,cout是会根据变量的类型自动选择输出的,char *会被当作是字符串,如果用printf("%d\n", p);输出就是指针的地址。
后2个问题同样
dxf1219 2008-06-13
  • 打赏
  • 举报
回复
27楼 前两个程序不对的,p是const char* 根本没有办法修改*p='b' 的。
xzhaoxzhao 2008-06-12
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 axing0308008341 的回复:]
C/C++ code
int main()
{
char *p="abc";
*p='b';
cout<<p<<endl;
return 0;
}//输出bbc..
[/Quote]
这段我试了,编译通过,但是运行时,提示“该内存不能为written”?屏蔽*p='b',才没问题,输出abc,怎么会这样?
难道这段代码也有问题?
还有
int main()
{
char *p="abc";
cout<<p<<endl;
return 0;
}
cout<<*p<<endl输出a可以理解,但p不是指针吗?cout<<p<<endl输出应该是一个地址值才对(我认为应该输出a的地址值才对)啊,怎么输出abc。而且cout<<p+1<<endl怎么输出bc,cout<<p+2<<endl怎么输出c?初学C++很多疑惑的地方,请朋友们指点迷津!
aa68454650 2008-06-12
  • 打赏
  • 举报
回复
楼38说得好
如果想输出char *p="abc"中的p的地址:

#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{

char *p="abc";

cout<<&p<<endl;
return 0;



}
handsomezwm 2008-06-12
  • 打赏
  • 举报
回复
char *p="abc"; 这里p是常量指针,p在栈存储区,字符窜“abc”在堆存储区内,或者说在常量存储区内。

char p[]="abc"; 这里的p是常量,代表字符串“abc”的首地址,字符串“abc”存储在栈存储区内。
xzhaoxzhao 2008-06-12
  • 打赏
  • 举报
回复
void main()
{
char *p="abc";
cout <<p<<endl; //这里输出的是所指向的内容
}


void main()
{
int g=3;
int *p;
p=&g;
cout <<p<<endl; //这里输出的是地址值本身
}
为什么会这样?
xzhaoxzhao 2008-06-12
  • 打赏
  • 举报
回复
void main()
{
char *p="abc";
cout <<p<<endl; //这里输出的是所指向的内容
}


void main()
{
int g=3;
int *p;
p=&g;
cout <<p<<endl; //这里输出的是地址值本身
}
为什么会这样?
xzhaoxzhao 2008-06-12
  • 打赏
  • 举报
回复
*p='b'这句编译可以通过,但是运行提示“该内存不能为written”? 这个问题还没回答
还有 *p 代表的是"abc"的第一个字符 也就是'a' ,那我要输出'a'的地址值怎么做?
ld_thinking 2008-06-12
  • 打赏
  • 举报
回复
int main()
{
char *p="abc";
cout < <p < <endl;
return 0;
}
cout < <*p < <endl输出a可以理解,但p不是指针吗?cout < <p < <endl输出应该是一个地址值才对(我认为应该输出a的地址值才对)啊,怎么输出abc。而且cout < <p+1 < <endl怎么输出bc,cout < <p+2 < <endl怎么输出c?初学C++很多疑惑的地方,请朋友们指点迷津!

---------------------------------------------------------------------
*p 代表的是"abc"的第一个字符 也就是'a', 这里传递到cout输出流的变量是char类型
count<<p 是指输出p指向首地址(也就是'a')的字符数组 ,直到遇到'\0'停止
count<<p+1 是输出p指向首地址下一个位置的开始(也就是'b')的字符数组,
以此类推


建议先把c学好以后再学c++


ld_thinking 2008-06-12
  • 打赏
  • 举报
回复
以上是以c语言为例
ld_thinking 2008-06-12
  • 打赏
  • 举报
回复
char *p = "abc"; //p指向abc字符串在内存中的首地址 也就是'a'的地址

*p = 'b';// 修改"abc" -> "bbc" 也就是把abc的第一个字符修改为b

*p = "abc" ; //错误 , p指向的值应该为单个字符
xzhaoxzhao 2008-06-12
  • 打赏
  • 举报
回复
请朋友们关注我的问题!
zhangjundriver 2008-06-11
  • 打赏
  • 举报
回复
27楼的第一个函数输出的是abc,因为我认为p 指向的是一个常量字符串,所以对起修改是不正确的,并且不能修改,
我在程序中也调试了输出的是abc,而不是bbc
加载更多回复(28)

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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