如何在C语言中初始化一个指针数组?[副本]

wkyowqbh  于 2023-10-16  发布在  其他
关注(0)|答案(4)|浏览(83)

此问题已在此处有答案

Array of pointers to an array of fixed size(9个回答)
上个月关门了。
编译器给了我以下错误:
[警告]来自不兼容指针类型的赋值
这是我的尝试;

char (*array[10])[20],string[20] = "AEIOU"; array[2] = string;

Array of pointers to an array of fixed size我已经找到了这个问题,但没有用.

rnmwe5a2

rnmwe5a21#

定义指向字符串的指针数组的最“自然”的方法:

char *array[10];

这将array定义为指向char的10个指针的数组。
然后

array[i] = string;

使元素i指向string的第一个字符。
从这个赋值中,array[i]基本上是string的别名。
或者如果你真的想要一个指向数组的指针:

char (*array[10])[20];
array[i] = &string;

注意这里使用了指向操作符&,以获取指向数组本身的指针。还要注意的是,这与上面显示的更“自然”的方式非常不同。这完全取决于您实际想要实现的目标,您的实际用例和问题是什么。
当前显示的代码是string * 衰减 * 为指向其第一个元素的指针,因此string&string[0]相同。类型为char *
您当前将array定义为指向数组的指针数组,因此array的每个元素都具有char (*)[20]类型。这就是&string的类型。

qeeaahzv

qeeaahzv2#

你正在定义char (*array[10])[20],它声明了一个10个指针的数组,每个指针指向一个20个字符的数组(正确)。
但在下面这行:

array[2] = string;

它将显示警告“assignment from incompatible pointer type”,因为在C/C++中,类型不兼容,所以在没有适当的类型转换的情况下,这是不允许的。在你的例子中,你试图将一个字符数组string分配给一个指向字符数组的指针数组的元素。这将是一个警告。
您可以更改为使用此选项来忽略警告:

array[2] = &string;

array[2]将保存string数组的地址,它指向字符数组。因此,该分配是兼容的。

nc1teljy

nc1teljy3#

C编译器不按使用的行收费。
每一行只写一件事。

  • 它更容易阅读
  • 更容易找到名称或键入值
  • 更容易改变
  • 在出现错误的情况下,您只需从编译器获得精确的行号

对比

char (*array[10])[20],string[20] = "AEIOU"; array[2] = string

#include <stdio.h>
int main(void)
{
  char string[20] = "AEIOU";
  char(*array[10])[20];

  array[2] = string;
}

一行一行

char string[20] = "AEIOU";

这是可以的,但你应该总是使用const作为提醒自己。如果你这样做,错误地尝试为string分配一些值,编译器会警告你,而不是当你的代码崩溃时在电话里的人。

char array[2] = string;

每个array都是一个指向char[20]的指针,所以缺少一个&。写:

char array[2] = &string;

不是初始化器

array[2] = &string;

这是个任务。不是初始化器。
这是一个初始化器:

char(*array[10])[20]  = {
    NULL,
    NULL,
    NULL,
    "A Test",
    string,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL
};

这个程序

#include <stdio.h>
int main(void)
{
    char string[20] = "AEIOU";
    char(*array[10])[20]  = {
    NULL,
    NULL,
    NULL,
    "A Test",
    string,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL
};

    array[2] = &string;
    printf("\
    #%d\t\"%s\"\n\
    #%d\t\"%s\"\n\
    #%d\t\"%s\"\n",
        2, array[2],
        3, array[3],
        4, array[4]);

    return 0;
}

指纹

#2  "AEIOU"
    #3  "A Test"
    #4  "AEIOU"

注意stringconst char[20]

vatpfxk5

vatpfxk54#

对于OP:你过度考虑了数组声明,每个数组[N]已经是一个数组指针,例如,数组[2]已经是一个数组指针:

char string[20] = "AEIOU";

char array[10][20] = 
{
  "Test 0",  // array[0]
  "Test 1",  // array[1]
  "AEIOU"    // array[2]
  // ...
};

// Or, after declaration, e.g.:

strcpy(array[2], string);

char string[20] = "AEIOU";

char* array[10] =
{
    "Test 0",
    "Test 1",
    string
};

// Or
array[2] = string;

相关问题