2011-12-20 19 views
2

的阵列为什么我得到一个警告当我这样做:指定数组名的指针的字符

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上运行它。

+1

[这个问题](http://stackoverflow.com/questions/1335786/c-differences-between-pointer-and-array)可能可以帮助你。 – netcoder 2011-12-20 07:10:25

+0

[为什么我不能直接将数组指向C中的指针](http://stackoverflow.com/questions/3504506/why-cant-i-assign-an-array-to-pointer-directly -in-c) – 2011-12-20 07:54:45

+1

阅读[comp.lang.c FAQ](http://c-faq.com)的第6部分。 – 2011-12-20 10:10:18

回答

1

我想str&str&str[0]都是相同的。

No. str&str[0] - 都表示指向第一个数组元素的指针。

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

如果您取消引用指针,则差异是类型。

尝试

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

+0

@凯蒂感谢您的编辑。我不知道'sizeof'产生'size_t'。使用'%z'不是更好吗,还是便携性更低? – glglgl 2011-12-20 11:53:16

+0

'%z'甚至不存在。 '%zu'是'size_t'的正确格式,但是它在C99中是新的,并且一些C实现可能不支持它;微软尤其对支持C99的热情不高。只要大小不超过“INT_MAX”(至少为32767),转换为“int”并使用“%d”是可移植的。只要大小不超过ULONG_MAX(至少为2147483647),您也可以强制转换为'unsigned long'并使用'%lu'。 – 2011-12-20 23:01:54

2

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

如果你想​​到"string",你仅仅需要做的:

char *arr_ptr = str;

​​简直是char*型,单级指针char的。

编辑:万一我不小心回避的问题,为什么分配&strchar (*arr_ptr)[]的原因消除误差是因为一个事实,即&strchar (*)[]型的,并且str只有char[]型(可衰减到的char*)。

+0

是的,我知道。但我仍然不明白为什么'str'或'&str [0]'是不兼容的。你只是改变了避免这个问题的'arr_ptr'的定义。 – Espresso 2011-12-20 07:24:44

+0

@NSCoder,因为str是一个字符数组,而arr_ptr是指向字符的指针数组。 – Gnat 2011-12-20 07:29:22

+0

我认为这是相反的方式。 'arr_ptr'是一个指向字符数组的指针。不是指向char的指针数组只会是'* foo []'? – Espresso 2011-12-20 07:33:50

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; 
} 

希望这有助于!

+0

在问题中编写的代码 - 编译代码 - 很好。这只是不同的(并不太常见)。你需要知道它做了什么,但它是有效的,不同于你的任何建议。 – 2011-12-20 07:51:10

+0

我认为通过提及(可能的)正确的方式,@NSCoder将能够找出他在分配不兼容类型时的错误。道歉,如果我的方法是不正确的! – 2011-12-20 09:35:04