为什么我这样做时会收到警告:
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上运行它。
答案 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)[]
的原因会删除错误,因为&str
是char (*)[]
类型为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;
}
希望这有帮助!