我读了这个answer,但我仍然不清楚:
类似于:
#include <stddef.h>
size_t
foo(const char ** str)
{
size_t i = 0;
while (*str[0])
i++;
return i;
}
int main (int argc, char ** argv)
{
foo(argv);
}
编译为
$ gcc main.c
main.c: In function 'main':
main.c:14:7: warning: passing argument 1 of 'foo' from incompatible pointer type [-Wincompatible-pointer-types]
14 | foo(argv);
| ^~~~
| |
| char **
main.c:4:19: note: expected 'const char **' but argument is of type 'char **'
4 | foo(const char ** str)
我的基本问题是:为什么我不能做更多的const
?我想说的是:我不会修改的字符,在这个函数。
对我来说,这似乎与另一个答案给出的情况不同,在另一个答案中,你欺骗自己的方式违反了char
的const
性质。
1条答案
按热度按时间6jygbczu1#
我的基本问题是:为什么我不能做更多的
const
?char **
是指向char *
的指针。将其更改为const char **
不会使其成为指向char *
类型的const
的指针;那就是char * const *
它将其更改为指向不同类型的指针。您可以将
char **
更改为char * const *
;将接受该类型的隐式转换。问题是:
char *
受到保护,不会被分配const char *
。给定char *p;
和const char *cp;
,则不允许p = cp;
。const char *
没有这种保护,因为将const char *
分配给const char *
当然是可以的。char **
更改为const char **
,则将删除保护。char *pp = &p;
,pp
指向一个受保护的对象。pp
被传递给void foo(const char **cpp)
,则类型const char **cpp
表示*cpp
不受保护。因此,foo
可以执行*cpp = &cp;
,这会将pp
更改为指向const char *
,这是不允许的。对我来说,这似乎与另一个答案给出的情况不同,...
不,是一样的: