社区
C++ 语言
帖子详情
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
打赏
收藏
char *p和char p[]
请指教下我 我的理解是这样的:char *p=“abc”意思是使P指向常量abc,于是如果我们用*p="def"则会报错,因为常量不能修改 如果是char p[]="abc"到话是把常量“abc”常量复制到数组p,这个时候p指向的是变量的空间,于是*p='d',*(p+1)='e',*(p+2)='f' 请问大家,我这样理解正确吗?谢谢大家!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
MySQL 数据类型和运算符
============================= # 数据类型 整数类型:五种 TINY SMALL MEDIUM INT BIG 浮点和定点小数类型:三种 FLOAT DOUBLE DECIMAL 日期与时间数据类型:五种 YEAR -1 字符串类型:二种
CHAR
(M) VAR
CHAR
(M) -1 ...
深入理解const
char
*p,
char
const*p,
char
*const p,const
char
**p,
char
*const*p ...
一、可能的组合: (1)const
char
*p (2)
char
const*p (3)
char
*const p (4)const
char
**p (5)
char
const**p (6)
char
*const *p (7)
char
**const p 当然还有在(5)、(6)、(7)中再插入一个const的若干情况,不过分析了以上7中,其他的就可类推了! 二、理解助记法宝:...
const
char
*p,
char
const *p和
char
*const p区别(面试题常见)
请看下面三种定义: const
char
*p;
char
const *p;
char
* const p; 请问三者有什么区别? 先看第一种,先看p,根据优先级它和*结合,是指针,指向
char
类型,但是
char
前面有一个const修饰,所以p所指向的内容为const类型不可修改。 第二种:由于没有const *的运算,若出现const *的形式,则const实际上是修...
char
*p与
char
**p
char
*p与
char
**p
char
str[6]={‘H’,‘E’,‘L’,‘L’,‘O’,’\0’}
char
*p=str
char
** p=&p
char
*p相当于p取了str的地址, * p才是str的内容。而
char
** p相当 * p于取了 str的地址,**p才是str的内容。而p是 * p的地址 假若str是你的钱包,那么
char
* p 中的p在这里就是存...
const
char
*p,
char
const*p和
char
* const p的区别
const
char
*p;//
char
*p是一个指针,指向
char
类型的,被const修饰,表示指向的内容是无法改变的 //但是,p可以改变
char
const *p;//由于没有const *的指针类型,所以const修饰
char
*p,和const
char
*p的效果一样
char
* const p;//const直接修饰p,表示p无法修改,但是指针指向的内容可以修改 总而言之,由const直接修饰的无法更改 ...
C++ 语言
64,639
社区成员
250,578
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章