const char ** vs const char *突变

时间:2019-05-24 15:42:27

标签: c pointers char

在我的代码中,我尝试执行以下操作:

// 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是不可分配的。为什么?

2 个答案:

答案 0 :(得分:2)

const char**读为“指向常量字符的(非常量)指针”。您可以修改stringsstrings[n],但不能修改strings[n][m]

const char*只是一个级别。您可以修改chars,但不能修改chars[n]

使strings[n]不可修改的方式是使用const char* const*-“指向 const 指向常量字符的指针(非const)”“ < / p>

还要注意,在您的示例中,stringschars未初始化。您需要先对其进行初始化,然后才能实际访问它们。

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)指针”。