将数组名称指定给指向字符数组的指针

时间:2011-12-20 06:43:17

标签: c

为什么我这样做时会收到警告:

char (*arr_ptr)[];
char str[] = "string";

arr_ptr = str;

警告是:

assignment from incompatible pointer type

但是当我将作业更改为:

arr_ptr = &str;

警告消失。我认为str&str&str[0]都是一样的。那么str&str[0]如何不相容?

我认为我的代码是由GCC编译的,因为我在TextMate上运行它。

3 个答案:

答案 0 :(得分:2)

在C中,str&str&str[0]引用相同的地址 - 数组的标签只是一种引用连续内存块起始地址的方式。 str&str显然属于不同的类型,但&str属于char (*)[]类型。

如果您希望arr_ptr指向指向"string",则只需执行以下操作:

char *arr_ptr = str;

arr_ptr只是char*类型,是指向char的单一指针。

编辑:如果我意外避免了这个问题,那么将&str分配给char (*arr_ptr)[]的原因会删除错误,因为&strchar (*)[]类型为str,而char[]仅为char*类型(可以衰减为{{1}})。

答案 1 :(得分:1)

  

我认为str&str&str[0]都是一样的。

没有。 str&str[0] - 两者都表示指向第一个数组元素的指针。

&str指向同一个地方,但它是指向完整数组的指针。

如果取消引用指针,则diffrence是类型。

尝试

printf("%d %d %d",
       (int)sizeof(*str),
       (int)sizeof(*(&str)),
       (int)sizeof(*(&str[0])));

答案 2 :(得分:0)

我猜你正在尝试的是这个:

#include <stdio.h>

int main()
{
    char *arr_ptr;
    char str[] = "string";

    arr_ptr = str;

    printf("%s \n", arr_ptr);
    printf("%s \n", str);

    return 0;
}

以下程序为您的理解添加了一个维度。

int main()
{
    char **arr_ptr;
    char *str[] = {"string1", "string2", "string3"};
    int i;

    arr_ptr = str;

    for (i=0 ; i<3 ; i++) {
        printf("%s \n", arr_ptr[i]);
        printf("%s \n", str[i]);
    }

    return 0;
}

希望这有帮助!