在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]
这里发生了什么?
答案 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()中的参数兼容,但不与bar
和baz
兼容,两者都期望连续的字符串指针序列。这就是为什么这两个给你一个编译器警告,因为该参数与传入的参数不兼容。