C 语言指针问题

2015-04-02 11:01:47 +08:00
 HxSeek

我觉得这样子做的话··输出的答案应该会是 s1变成bstring1 s2变成astring2才对, 可是调试的时候,发现那句话错了··请问是为什么?导致它们之间不能互相赋值?

代码如下:

include<iostream>

using namespace std;

void exchange(char *a,char *b)
{
char c;
c = *a;
*a = *b; //为什么这句话会错
*b = c;
}

int main()
{
char *s1 = "atring 1";
char *s2 = "btring 2";

exchange(s1,s2);
cout << s1 << endl;
cout << s2 << endl;

return 0;

}

3622 次点击
所在节点    程序员
21 条回复
rrfeng
2015-04-02 11:07:21 +08:00
char *a; //a 是一个指针
char c = *a; // 将指针的指针丢给了 c

&a 才是指针指向内容的引用。
sinxccc
2015-04-02 11:09:45 +08:00
*a 是指针指向的内容,而这个内容是个字符串常量,是不可以修改的。
jiang42
2015-04-02 11:33:44 +08:00
fix:
char s1[] = "atring 1";
char s2[] = "btring 2";

@rrfeng 似乎说错了?
gdqyn
2015-04-02 11:50:30 +08:00
二楼说的对,如果把形参改为传入引用,然后交换指针指向的内容就可以了
void exchange(char *&a,char *&b)
{
char *c;
c = a;
a = b; //为什么这句话会错
b = c;
}

用char *指向字符串会报警告(虽然程序员不在乎警告)

完整的
#include <iostream>
using namespace std;

void exchange(const char *&a, const char *&b)
{
const char *c;
c = a;
a = b; //为什么这句话会错
b = c;
}

int main()
{
const char *s1 = "atring 1";
const char *s2 = "btring 2";

exchange(s1,s2);
cout << s1 << endl;
cout << s2 << endl;

return 0;
}
Andiry
2015-04-02 11:52:14 +08:00
s1和s2是常量指针,内容不能修改
cheng007
2015-04-02 12:02:54 +08:00
@rrfeng 你说的不对
@Andiry 你说的对。
好久没有写c代码了,细节都忘记差不多了。
这样就是OK的,s1, s2的内存是栈内存。
void exchange(char *a, char *b)
{
char c;
c = *a;
*a = *b;
*b = c;
}

int main()
{
char s1[] = "astring";
char s2[] = "bstring";
exchange(s1, s2);
printf("str1 %s , str2 %s", s1, s2);
return 0;
}
fliar
2015-04-02 12:14:43 +08:00
我想你理解了指針就是地址,但是有点把c想得太智能了*a = *b是不会复制整个字符串的,出错原因楼上@Andiry说了
手动复制一般用memcpy复制内容,当然这个例子用楼上@gdqyn换址比较好
我其实建议新手上路还是std::string比较省心,当然如果这个是你作业要求那当我没说
HxSeek
2015-04-02 12:20:16 +08:00
谢谢大家··我懂了
Andiry
2015-04-02 12:21:51 +08:00
@cheng007 你这么写也是错的,只不过交换了s1和s2的第一个字符而已
rrfeng
2015-04-02 12:42:20 +08:00
谢谢大家,我也懂了……
Comdex
2015-04-02 12:42:28 +08:00
帖子中的是c++吧?
cheng007
2015-04-02 13:02:09 +08:00
@Andiry 我没有说要交换字符串啊,按照他的写法写而已。
Andiry
2015-04-02 13:08:41 +08:00
@cheng007 你说得对,我被误导了,以为他要交换两个字符串
blackboom
2015-04-02 13:16:19 +08:00
*a代表取值,*b也是,把常量赋值给常量,当然不可以
icedx
2015-04-02 13:29:54 +08:00
char* c;
c = a;
a = b;
b = c;
C++ 少用指针 引用才是正途
ibudao
2015-04-02 13:29:57 +08:00
等号(=)左边的只能是左值,左值映射的是一段内存区域,而等号右边既可以为左值,也可以为右值。记住这个就行了。
hualuogeng
2015-04-02 13:38:29 +08:00
@gdqyn 你的程序和楼主要的效果不一样,楼主就是想交换两个字符串的第一个字符。

再者,没有说程序员就不关心warning的,编译器发出告警并不是为了刷存在感。
linux40
2015-04-02 20:06:58 +08:00
不要使用char *s1 = "atring 1",它只是声明了一个指针,但"xxx"是常量表达式,话说书上将常量和指针的时候都有写啊。。。
lirau
2015-04-03 00:49:51 +08:00
从这个问题可以看出本社区人员水平的参差不齐啊
lirau
2015-04-03 00:55:37 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/181057

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX