【问题标题】:Difference b/w char* str[],char *str and char str[]黑白 char* str[],char *str 和 char str[] 的区别
【发布时间】:2015-09-03 10:18:45
【问题描述】:

黑白有什么区别:

function(char* str )
function(char* str[] )
function(char str[] )

它们是如何被调用的(string/char[] 的类型)?

【问题讨论】:

  • 谁告诉你SO是一个辅导服务?请告诉我们为什么 google 无法回答您的问题。
  • 请用谷歌搜索此类问题

标签: c++ c pointers char


【解决方案1】:

函数(char* str)

函数采用指向 char 的指针,你可以这样称呼它:

char arr[10];
function(arr); // here arr is actually a char[] type,but it decays to char* 

你不知道arr长度的函数内部

,函数(char* str[])

这是一个指向 char 的指针数组,你可以像这样使用它:

char arr1[] = "foo";
char arr2[] = "fai";
char arr3[] = "foo";
char* sarr[] { arr1, arr2, arr3 }; 
function(sarr); // here also no length of sarr is known inside function, you should pass is as second argument

和函数(char str[])

这是一个以char[]类型作为str参数的函数,你可以像这样使用它:

char aa[12] = { "asd" };
function(aa);

我看不出函数(char* str)和函数(char str[])之间有什么巨大的区别。编译器甚至不允许您使用此类参数重载函数:

void function (char str[]); // compiler sees it as char* str
void function (char* str);

产生错误。

function(char* str[] ) 另一方面是完全不同的,因为你有 char 指针数组而不是 chars 数组

【讨论】:

  • 最后一个例子不是最安全的。如果f 确实更改了char[] - 更改字符串文字具有未定义的行为
  • @DavidHaim我觉得很好,这是一个数组初始化,你可以在函数内部修改它。问题在于char* sarr[] { "foo", "fai", "foo" }; char* 应该是const char*
  • “我没有看到任何巨大的差异......”因为没有。它们是相同的功能。您绝对可以连续编写这些声明,因为它们只是重新声明 - 您不能同时定义两者。
【解决方案2】:

function (char *str) 与 function (char str[]) 相同,都是以 char 数组为参数的函数。 function (char *str[]) 是一个以char数组为参数的函数。

可以使用指针调用这些函数 示例:

函数 (char *str[]) 字符 **x .... 函数 (x);

【讨论】:

  • 你确定它们是一样的吗?或者你的意思是他们被同等对待?我只是问问。
【解决方案3】:

char *s 是指向 char 的指针

char s[] 是一个数组

char *s[] 是指向 char 的指针数组。

但是当它们被用作函数参数时,那么

char *s and char s[]

char *s[] and char **s

待遇相同。

这意味着以下内容:

int foo(char s[] , char *s[]){
  /* code  */
}

等同于:

int foo(char *s, char **s){
/* code */
}

【讨论】:

    【解决方案4】:

    在函数参数声明的上下文中,f( T a[] )f( T *a ) 的含义完全相同; a 被声明为指向 T 的指针。 f( T *a[] )a 声明为指向 T 的指针。

    这是 B 编程语言(C 派生自该语言)的保留,其中 a[]a 声明为指针。

    对于常规对象声明,T a[]a 声明为一个未知大小的数组;声明不完整a 在定义大小之前不能使用。

    【讨论】:

      猜你喜欢
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 2018-06-27
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多