char[] 和 char* 做参数有什么区别?

ssr奥利奥 2017-10-10 04:40:15
void foo(char* str)
void bar(char str[])

这两个有什么别么?
...全文
757 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
热血打工人 2017-10-11
  • 打赏
  • 举报
回复
没有区别的,数组退化成指针了
codedoctor 2017-10-11
  • 打赏
  • 举报
回复
。。点错了,如下:
void test1(A[]) {

0113DAD0  push        ebp  
0113DAD1  mov         ebp,esp  
0113DAD3  sub         esp,0C0h  
0113DAD9  push        ebx  
0113DADA  push        esi  
0113DADB  push        edi  
0113DADC  lea         edi,[ebp-0C0h]  
0113DAE2  mov         ecx,30h  
0113DAE7  mov         eax,0CCCCCCCCh  
0113DAEC  rep stos    dword ptr es:[edi]  
}
void test2(A *) {
0113DE80  push        ebp  
0113DE81  mov         ebp,esp  
0113DE83  sub         esp,0C0h  
0113DE89  push        ebx  
0113DE8A  push        esi  
0113DE8B  push        edi  
0113DE8C  lea         edi,[ebp-0C0h]  
0113DE92  mov         ecx,30h  
0113DE97  mov         eax,0CCCCCCCCh  
0113DE9C  rep stos    dword ptr es:[edi]  

}

可以看到,编译器全部都当作指针来使用的。OK,结束
codedoctor 2017-10-11
  • 打赏
  • 举报
回复
函数声明忘贴了,如下:

void test1(char []) {

}
void test2(char *) {

}
同时测试了复杂类型:
class A {
public:
	A() { };
	~A() {};
};
void test1(A[]) {

}
void test2(A *) {

}
发现汇编代码如下:
codedoctor 2017-10-11
  • 打赏
  • 举报
回复
测试了一下,代码如下:
	
char b[5];
	char* a=NULL;
	test1(b);
	test2(b);
	test1(a);
	test2(a);
发现编译器会自动将这段代码生成如下汇编代码:
	test1(b);
00BD03F4  lea         eax,[b]  
00BD03F7  push        eax  
00BD03F8  call        test1 (0BA72A3h)  
00BD03FD  add         esp,4  
	test2(b);
00BD0400  lea         eax,[b]  
00BD0403  push        eax  
00BD0404  call        test2 (0BA8658h)  
00BD0409  add         esp,4  
	test1(a);
00BD040C  mov         eax,dword ptr [a]  
00BD040F  push        eax  
00BD0410  call        test1 (0BA72A3h)  
00BD0415  add         esp,4  
	test2(a);
00BD0418  mov         eax,dword ptr [a]  
00BD041B  push        eax  
00BD041C  call        test2 (0BA8658h)  
00BD0421  add         esp,4  
可以看到,现代C++已经完全摒弃了数组的用法(至少在简单类型方面),而直接用指针加偏移量去取代数组, 其实你并不需要为此担心,这个并不会对程序正确性有所影响。 刚学C++的时候纠结于语法是很正常的,学到后面你就会为当时问出这种问题而感到奇怪。 多实践吧。
paschen 版主 2017-10-10
  • 打赏
  • 举报
回复
没有区别,数组作为函数参数时本身也会退化为指针,所以函数中,无论哪种写法,都表示一个指针
BLEACH113 2017-10-10
  • 打赏
  • 举报
回复
没区别,希望caller传数组就用char[], 否则就用char*。就像class和struct一样。
悟了个空 2017-10-10
  • 打赏
  • 举报
回复
凡事不要这么极端, 系统提供的接口里就有这种情况, 你怎么不去问问他们为什么不把整个互联网当做参数. 当年预测卡车会淘汰掉拖拉机一样, 只是大部分都是用卡车, 而不是拖拉机真的不存在.
悟了个空 2017-10-10
  • 打赏
  • 举报
回复
个人认为, 两者没什么区别, 但是char str[] 做参数的话容易让使用的人理解, 例如: 有一个学生结构体, 我们需要传结构体数组 typedef struct stu { int age; }S; 此时写成 (S *stu), 别人不知道是学生结构体指针还是数组.
赵4老师 2017-10-10
  • 打赏
  • 举报
回复
思考一下,为什么没有哪个C库函数使用char[]做参数。
赵4老师 2017-10-10
  • 打赏
  • 举报
回复
引用 5 楼 qq_31336071 的回复:
凡事不要这么极端, 系统提供的接口里就有这种情况, 你怎么不去问问他们为什么不把整个互联网当做参数. 当年预测卡车会淘汰掉拖拉机一样, 只是大部分都是用卡车, 而不是拖拉机真的不存在.
矫枉必须过正!
bravery36 2017-10-10
  • 打赏
  • 举报
回复 1
引用 3 楼 qq_31336071 的回复:
个人认为, 两者没什么区别, 但是char str[] 做参数的话容易让使用的人理解, 例如: 有一个学生结构体, 我们需要传结构体数组 typedef struct stu { int age; }S; 此时写成 (S *stu), 别人不知道是学生结构体指针还是数组.
刚好相反,作为参数时所有数组都会退化成指针,用数组才会误解,新人会以为sizeof还能用。
赵4老师 2017-10-10
  • 打赏
  • 举报
回复
请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢?
ssr奥利奥 2017-10-10
  • 打赏
  • 举报
回复
char *myreverse(char c[]) {
	char temp;
	int len = strlen(c);
	int i = 0, j = len - 1;
	while (i<j)
	{
		temp = c[i];
		c[i] = c[j];
		c[j] = temp;
		i++;
		j--;
	}
	return c;
}
char *myreverse(char *c) {
	char temp;
	int len = strlen(c);
	int i = 0, j = len - 1;
	while (i<j)
	{
		temp = c[i];
		c[i] = c[j];
		c[j] = temp;
		i++;
		j--;
	}
	return c;
}
这两个都可以用,不知道这俩有什么本质区别么
自信男孩 2017-10-10
  • 打赏
  • 举报
回复
基本上没有区别,定义的形参都是指针,虽然char c[]看着像数组,编译器解析时是按照指针解析的。

64,687

社区成员

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

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