指针问题~~

KID_coder 2010-07-28 02:10:57

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;


void fun(char *str1, char *str2)
{
*str1 = *str2; //这样赋值有什么问题
}

int _tmain(int argc, _TCHAR* argv[])
{
char *str1 = "I am glad to meet you!";
char *str2 = "hello!";
fun(str1,str2);
cout << str2 << endl;
system("pause");
return 0;
}
...全文
126 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
KID_coder 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 fengrider 的回复:]
char s1[]="hello";
char s2[]="world";
在栈里面定义两个字符数组,数组名分别是s1,s2,s1的长度是"hello"字符数+1,s2的长度是world字符数+1,之所以要+1,是因为末尾是字符串结束符'\0',这是个非可见字符,也要计算在内的。
相当于这样:char s1[6] = {'h','e','l','l','o','\0'};
char s2[……
[/Quote]
哈哈~~都已经结贴了~居然还有人回复~
恩恩~是在常量区存放~
但我尝试用别的指针来更改它,但行不通,不知道有没有别的办法更改
FengRider 2010-07-28
  • 打赏
  • 举报
回复
char s1[]="hello";
char s2[]="world";
在栈里面定义两个字符数组,数组名分别是s1,s2,s1的长度是"hello"字符数+1,s2的长度是world字符数+1,之所以要+1,是因为末尾是字符串结束符'\0',这是个非可见字符,也要计算在内的。
相当于这样:char s1[6] = {'h','e','l','l','o','\0'};
char s2[7] = {'w','o','r','l','d','\0',};

char *str1 = "I am glad to meet you!";
char *str2 = "hello!";
这是定义两个常量串,在常量区定义的,实际上这个定义与
const char * str1 = "I am glad to meet you!";
const char * str2 = "hello!";
等价
这里str1和str2虽然系统为其分配的空间在栈里面,但这个空间里面只能存放属于常量区的地址值。
而s1和s2作为指针,固定死了只能指向内存中可以存放7个字符的空间里面,但它们指向的空间中的值,是可以更改的。

语言表达能力有限,请自己仔细体味。关键是要弄清楚指针左值、右值,存放空间的细则部分
leiqiuchan 2010-07-28
  • 打赏
  • 举报
回复
#include <stdio.h>

fun(char *s1,char *s2)
{
while((*s1++=*s2++)!='\0')
;
}
main()
{
char s1[]="hello";
char s2[]="world";
fun(s1,s2);
printf("%s",s1);

}
这样也可以
不过谁讲仔细点
char s1[]="hello";
char s2[]="world";

char *str1 = "I am glad to meet you!";
char *str2 = "hello!";
的区别
KID_coder 2010-07-28
  • 打赏
  • 举报
回复
好吧~~结贴~
回10楼~是2010
Six_dimensional 2010-07-28
  • 打赏
  • 举报
回复
void fun(char *str1, char *str2)
{
*str1 = *str2; //这样赋值有什么问题
}
改成void fun(char *str1, char *str2)
{
str1 = str2; //这样就行了
}
*str1为I、*str2为h,分别存储于静态数据区,是无法改变的,你将str1指向str2后在
cout << str2 << endl;
那么你会发现打印出” hello“ 的
wujun_dry 2010-07-28
  • 打赏
  • 举报
回复
楼主用的是vs2010吗?请教
liuwei2500 2010-07-28
  • 打赏
  • 举报
回复
你的赋值应该是直接指针str1指向str2所指向的位置就可以了
ArmStronger 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kid_coder 的回复:]
引用 1 楼 cfz379945430 的回复:
常量字符串不能修改,肯定要报错

能不能说详细点?为什么是常量字符串?
[/Quote]
char *str1 = "I am glad to meet you!";
char *str2 = "hello!";

改成下面:
char str1[] = "I am glad to meet you!";
char str2[] = "hello!";

cbib_cat 2010-07-28
  • 打赏
  • 举报
回复
char *str1 = "I am glad to meet you!";
char *str2 = "hello!";

你这样定义,编译器 就在静态区分配空间,存放两个字符串,并把字符串当做常量。

可做
char str1[] = "I am glad to meet you!";
char str2[] = "hello!";
这样的定义
KID_coder 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pengzhixi 的回复:]
*str1 = *str2; //你这样只改变了str1的第一个字符
[/Quote]
恩~~不过我不明白为什么出错~
KID_coder 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cfz379945430 的回复:]
常量字符串不能修改,肯定要报错
[/Quote]
能不能说详细点?为什么是常量字符串?
pengzhixi 2010-07-28
  • 打赏
  • 举报
回复
*str1 = *str2; //你这样只改变了str1的第一个字符
太乙 2010-07-28
  • 打赏
  • 举报
回复
#include <iostream>
#include <string>
using namespace std;


void fun(char *str1, char *str2)
{
strcpy(str1 , str2); //这样赋值有什么问题
}

int _tmain(int argc, _TCHAR* argv[])
{
char str1[] = "I am glad to meet you!";
char str2[] = "hello!";
fun(str1,str2);
cout << str2 << endl;
system("pause");
return 0;
}
ayw215 2010-07-28
  • 打赏
  • 举报
回复
void fun(char **str1, char **str2)
{
*str1 = *str2; //这样赋值有什么问题
}

fun(&str1,&str2);

这样就ok了
ArmStronger 2010-07-28
  • 打赏
  • 举报
回复
常量字符串不能修改,肯定要报错

64,637

社区成员

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

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