在我的代码中,我尝试执行以下操作:
// Attempt #1
const char** strings;
strings[0] = "apple";
strings[1] = "orange";
strings[3] = "bananas";
// Attempt #2
const char* chars;
chars[0] = 'a'; // Error
chars[1] = 'b'; // Error again
当我尝试GCC时,尝试尝试#1,但是尝试尝试#2,它说LHS必须是可分配的。显然,借助于const
标识符,数组char是不可分配的。为什么?
答案 0 :(得分:2)
将const char**
读为“指向常量字符的(非常量)指针”。您可以修改strings
和strings[n]
,但不能修改strings[n][m]
。
const char*
只是一个级别。您可以修改chars
,但不能修改chars[n]
。
使strings[n]
不可修改的方式是使用const char* const*
-“指向 const 指向常量字符的指针(非const)”“ < / p>
还要注意,在您的示例中,strings
和chars
未初始化。您需要先对其进行初始化,然后才能实际访问它们。
This question具有如何读取C声明的方法。在这些简单的情况下,您从右到左阅读。
答案 1 :(得分:0)
{5,7,8,9}
是指向char *string
的数组的指针。像这样的东西:
char
就像您有一个数组和指向该数组的指针一样:
.----. .----. .----.
| s | - | a | - | m |
.----. .----. .----.
^
|
char *string --.
您可以通过多种方式初始化char strArr[3];
char *ptrToStr = &strArr;
:
char *
但是char *string;
scanf("%as", string);
/* if you don't allocate buffer for `*string`, and specify "a" in string format,
then `scanf` will do it for you. this is GNU-only extension. */
char *string2;
string2 = (char *) malloc (BUFF_SIZE);
sprintf(string2, "%s" , "Ghasem Ramezani");
...
是指向char **string
数组的指针的指针。像这样的东西:
char
例如 .----. .----. .----.
| s | - | a | - | 1 |
.----. .----. .----.
^
|
.-> char *string --.
| .----. .----. .----.
| | s | - | a | - | 2 |
| .----. .----. .----.
| ^
| |
.-> char *string2 --.
|
.-------------.
|
char **strArr ---.
,您还记得char **
中的argv
自变量吗?就是main ()
的类型。我们来看一个例子:
char **
/*1*/ #include <stdio.h>
/*2*/ int main(int argc, char *argv[]) {
/*3*/ for (int i = 0; i < argc; ++i)
/*4*/ puts(argv[i]);
/*5*/ return 0;
/*6*/ }
如您在第2行中看到的,我们可以写$> gcc -o output main.c
$> ./output ghasem ramezani
./output
ghasem
ramezani
$>
而不是char *[]
。为什么呢?因为正如我和@Kevin所说:
将const char **读为“指向常量字符的(非const)指针”。