将char数组传递给带有char指针的函数

时间:2018-04-27 04:53:31

标签: c arrays pointers

在C中,为什么我能够将字符数组传递给以library(dplyr) df1 %>% group_by_at(names(.)[1:3]) %>% summarise_all(na.omit) #Or #summarise_all(funs(.[!is.na(.)])) # A tibble: 3 x 6 # Groups: d, init_cont [?] # d init_cont family `1` `2` `3` # <int> <chr> <chr> <int> <int> <int> #1 1 I C 1 4 3 #2 2 I D 2 1 4 #3 3 K C 3 4 1 作为参数的函数,但我不能将数组的地址传递给带有{{1}的函数}?

更新:有趣的是,将参数类型更改为char *并不会更改编译器警告

例如:

char **

在第二种情况下,我收到编译器警告:

char* qux[12]

这里发生了什么?

2 个答案:

答案 0 :(得分:5)

数组自然衰落到指向第一个元素的指针。因此,在通话foo(str)中,它与foo(&str[0])完全相同。这是char *类型,所以一切都好。

现在第二个电话,bar,是另一个问题。当您使用&str时,您没有获得指向数组第一个元素的指针,您将获得指向数组本身的指针。正如编译器所指出的,这是char (*)[12]类型,它与char **非常不同(并且与baz不相容。

最后,当您声明char *[12]时,您说该参数的类型为char,那就是您有一个数组或12个指针到char,而不是你有指向12 char *[12]数组的指针。此外,由于数组衰减为指针,char **实际上 ByteArrayInputStream fileInputStream = new ByteArrayInputStream(dataFile.getContent()); int bytesAvailable = fileInputStream.available(); int maxBufferSize = 1024 * 1024;//1 mb buffer - set size according to your need int bufferSize = Math.min(bytesAvailable, maxBufferSize); byte[] buffer = new byte[bufferSize]; int bytesRead = fileInputStream.read(buffer, 0, bufferSize); while (bytesRead > 0) { dataOutputStream.write(buffer, 0, bufferSize); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); bytesRead = fileInputStream.read(buffer, 0, bufferSize); } dataOutputStream.writeBytes(lineEnd); 相同

答案 1 :(得分:2)

在C中,char *表示指向连续字符序列的指针。具有空终止的连续字符序列是我们在C中称为字符串的原因。

char **是指向连续字符串序列的指针,因为每个字符串都是以null(&#39; \ 0&#39;)字符终止的连续字符序列,char **表示连续的空终止字符序列的连续序列。

您的声明:

 char str[12] = "Hello there";

str声明为长度为12的字符数组,并将其初始化为12个字符{'H','e','l','l','o',' ','t','h','e','r','e','\0'}。这与foo()中的参数兼容,但不与barbaz兼容,两者都期望连续的字符串指针序列。这就是为什么这两个给你一个编译器警告,因为该参数与传入的参数不兼容。