C语言 如何使用VLA语法声明带有常量指针的函数

ca1c2owp  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(125)

我是C语言的新手,所以我希望我使用的术语是正确的。我已经看到一些资源建议应该使用VLA语法的函数参数,应该是非空指针,如下所示

void foo(char bar[static 1])

这意味着bar应该是一个非空的指针,因为指针会衰减。一些编译器可能会发出关于传递空指针的警告。
我想知道如何将该参数声明为指向const char的const指针。那么,VLA语法中的

void foo(char bar* const)

这适用于指向const char的指针

void foo(const char bar[static 1])

void foo(const char const bar[static 1])

发出关于重复const的警告。

pcww981p

pcww981p1#

您需要将const关键字放在方括号内:

void foo(const char bar[static const 1])

这(或多或少)相当于:

void foo(const char * const bar)
92dk7w1h

92dk7w1h2#

void foo(const char bar[static const 1])
相当于:
void foo(const char*const bar)
(除了可能的空指针检查)
也就是说,指向类型的限定符像往常一样写在指向类型说明符的左边:const char
[ ]之间的所有限定符都应用于“衰变”指针类型本身。理解它的最简单方法可能是考虑哪种指针类型等效于数组参数版本。在这种情况下,void foo(const char bar[1]) 100%等效于void foo(const char* bar),前者被调整为后者。

void foo(const char bar[static const 1])
                        ^-------------- all type qualifiers from here

void foo(const char*const bar)
                    ^------------------ end up here when the array parameter gets adjusted

在处理restrict指针的罕见情况下,了解这一点很重要。如果你有两个数组,保证不重叠,不能是空指针,那么:

void foo (char a1[restrict static 1], char a2[restrict static 1])

// gets adjusted to:

void foo (char*restrict a1, char*restrict a2)

同样对于2D阵列:
void foo (size_t n, char bar[const][n]); ->
void foo (size_t n, char(*const bar)[n]);

相关问题