对于1d char数组,您可以像这样将它们作为字符串文字传递
#include <stdio.h>
void go(char *a)
{
printf("%s", a);
}
int main()
{
go("Hello");
return 0;
}
但是我们可以用2d char数组做到这一点吗?比如
void go (int rowSize, int colSize, char a[rowSize][colSize])
{
for (int i = 0; i < rowSize; ++i) {
printf("%sn"), a[i]);
}
}
go(2, 16, {"Hello", "Hi"});
您需要使用复合文字:
void go (size_t rowSize, size_t colSize, char a[rowSize][colSize])
{
for (size_t i = 0; i < rowSize; ++i)
{
printf("%sn", a[i]);
}
}
int main(void)
{
go(2, 16, (char[][16]){"Hello", "Hi"});
return 0;
}
正如@Lundin所建议的,你也可以使用指针数组:
void go (size_t nstrings, char **strings)
{
for (size_t i = 0; i < nstrings; ++i) {
printf("%sn", strings[i]);
}
}
int main()
{
go(2, (char *[]){"Hello", "Hi"});
return 0;
}
或更多const
正确版本:
void go (int nstrings, char *const *strings)
{
for (int i = 0; i < nstrings; ++i) {
printf("%sn", strings[i]);
}
}
int main()
{
go(2, (char *const[]){"Hello", "Hi"});
return 0;
}
对于大小、索引等,最好使用size_t
或ssize_t
。
如果您想要一个指向只读字符串字面值的数组,它必须是一个字符指针数组,char* array[] = {"Hello", "Hi"};
。这种类型与2D字符数组完全不同,它们是不兼容的。
在这种情况下使用哪个表单取决于您想要做什么。这些应该是读/写字符串还是只读的?您是否计划调整单个字符串的大小?等等......字符串字面值总是只读的,所以当指向它们时使用的正确指针类型是const char*
。但是,如果您仅将字符串字面值用于初始化读/写2D数组,则这无关紧要。
假设用例只是在函数中打印一堆字符串字面值,没有其他内容,那么最正确的形式是:
#include <stdio.h>
void go(size_t n, const char* a[n]) {
for (size_t i = 0; i < n; ++i) {
puts(a[i]);
}
}
int main() {
go(2, (const char*[]){"Hello", "Hi"});
}
这在功能上几乎与2D数组版本相同,但它可能不使用任何临时内存来存储字符串,因此您可以节省一些2x16字节等(这不是什么大问题)。