请教,如何把字符串常量当作函数参数传入,谢谢!

enjoyreading 2012-03-20 01:26:12
例如下面的情况,想通过print函数把DEST_STR打印出来。
能否直接把DEST_STR赋值给print,求解,谢谢!
//我实验了以下两种方式,都可以正常打印出来,请问哪种方式是对的,更合适?


#define DEST_STR "shanghai"

void print(char* pstr)
{
printf("%s",pstr);
}

//我实验了以下两种方式,都可以正常打印出来,请问哪种方式是对的,更合适?
print(&DEST_STR);
print(DEST_STR);
...全文
1790 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
enjoyreading 2012-03-30
  • 打赏
  • 举报
回复
谢谢各位~!原始写法在vc上都是可以编译过的
mosal 2012-03-20
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;

void print2d(char (* pstr)[3])
{
cout << pstr[0] << endl;
}

void print1d(char (& pstr)[3])
{
cout << pstr << endl;
}
int main()
{

char a[][3] = {{'a','b','\0'}};
print2d(a);
char b[3] = {'a','b','\0'};
print1d(b);
print2d(&b);
return 0;
}

希望对你理解有所帮助
赵4老师 2012-03-20
  • 打赏
  • 举报
回复
这是宏,不是字符串常量。

编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。
mosal 2012-03-20
  • 打赏
  • 举报
回复
根据编译器报错,是把他当成一个二维组去处理了,即参数为 char (tmp*)[9]或者 char tmp[][9][Quote=引用 4 楼 zmlovelx 的回复:]

gcc
第一种
error: cannot convert ‘const char (*)[9]’ to ‘char*’ for argument ‘1’ to ‘void print(char*)’
[/Quote]
qieman 2012-03-20
  • 打赏
  • 举报
回复
dev-cpp上试了下第一种编译不过,要加显示类型转换才行。
qieman 2012-03-20
  • 打赏
  • 举报
回复
给字符串常量取地址没见过,不过会出现4楼的转换,会出错吧
mosal 2012-03-20
  • 打赏
  • 举报
回复
你要知道 宏是直接替换 , printf的参数是c风格字符串 。printf(“xxxxx"),而不是 printf(&"xxxxx")
mosal 2012-03-20
  • 打赏
  • 举报
回复
扯淡 指针传递只是复制指针 指向的内存是不复制的 所以你对那块内存的修改都是直接修改 唯一不改的是你传进去之前那个指针的位置(即被复制的那个地址)[Quote=引用 1 楼 qixing1115 的回复:]

都是对的,区别在于
第一种:你可以对参数做修改,做的修改可以传递到函数外的变量
第二种:你可以对参数做修改,但做的修改不可以传递到函数外的变量,即变量还是原来的值,如:
char buf[7]="abcde"
void print(char* pstr)
{
pstr[2] = 'm';
printf("%s",pstr);
}
调用完成后buf还是"a……
[/Quote]
qixing1115 2012-03-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 muyi66 的回复:]
???传进去的是指向常量字符串的指针,你怎么能改变它?

和你举例的情况不一样,你的例子里字符串是存在变量里面的,而LZ的字符串却是个常量。

常量字符串本来就是用指针来传递和表达的,对它取&是没意义的操作。
[/Quote]

常量另当别论,我的解释只针对那两种传参方式,没注意到#define DEST_STR "shanghai",失误
帅得不敢出门 2012-03-20
  • 打赏
  • 举报
回复
gcc
第一种
error: cannot convert ‘const char (*)[9]’ to ‘char*’ for argument ‘1’ to ‘void print(char*)’
面包大师 2012-03-20
  • 打赏
  • 举报
回复
print(DEST_STR);//这个
muyi66 2012-03-20
  • 打赏
  • 举报
回复
???传进去的是指向常量字符串的指针,你怎么能改变它?

和你举例的情况不一样,你的例子里字符串是存在变量里面的,而LZ的字符串却是个常量。

常量字符串本来就是用指针来传递和表达的,对它取&是没意义的操作。
qixing1115 2012-03-20
  • 打赏
  • 举报
回复
都是对的,区别在于
第一种:你可以对参数做修改,做的修改可以传递到函数外的变量
第二种:你可以对参数做修改,但做的修改不可以传递到函数外的变量,即变量还是原来的值,如:
char buf[7]="abcde"
void print(char* pstr)
{
pstr[2] = 'm';
printf("%s",pstr);
}
调用完成后buf还是"abcde"

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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