C语言中指针的正确初始化方法是什么?

6
以下是指针初始化的区别:

int *p;

int* p;

int * p;

这三种方式都可以用于声明指针变量。其中第一种格式比较常见,但实际上它们没有本质区别。
char array_thing[10];

char *char_pointer;

以下初始化方式有何不同?
1.) char_pointer = array_thing;

2.) char_pointer = &array_thing

第二次初始化是否有效?

3
@k-ballo 不确定你是如何得出这是作业的结论的。 - MGZero
这不是作业,我只是想学习C语言。 - diesel
1
@K-ballo:并不是每个提出基础问题的人都是试图通过学术信息学作弊,有些人真的想要学习。 - orlp
1
@K-ballo:这就是为什么我在评论中以“如果”开头,我并没有指责任何人,只是觉得这可能是作业。 - K-ballo
3
感谢您的提问。如果想学习C语言,理解这样的内容是很重要的。"+1 for asking." 的意思是“点赞表扬你的提问”。请问还有其他需要翻译的吗? - R.. GitHub STOP HELPING ICE
4个回答

5
第二次初始化无效。你需要使用以下方式:
char_pointer = array_thing;

或者

char_pointer = &array_thing[0];

&array_thing是指向数组的指针(在这种情况下,类型为char (*)[10]),您正在寻找指向数组第一个元素的指针。


第二次初始化可能仍然可以工作,但它应该会抛出一个关于指针类型不兼容的警告。 - Dmitri
1
@Dmitri,除了 void * 之外的指针转换在 C 中没有显式类型转换是非法的。6.5.4 强制转换运算符,第3段:“涉及指针的转换...必须通过显式强制转换来指定。” - Carl Norum
@CarlNorum,也许是这样,但有些编译器可以允许它。我用gcc尝试过,它给了一个警告,但编译和运行都没有问题。所以这不是正确的方式,但“可能仍然有效”。 - Dmitri
gcc允许很多无效的C语言写法,这也是为什么很多C代码(尤其是自由开源软件)质量很差的主要原因之一... - R.. GitHub STOP HELPING ICE

1

0
在第一个案例中,您正在将char_pointer设置为array_thing的第一个元素(实际上是它的地址)。使用指针算术运算将带您到其他元素,索引也是如此。例如:
char_pointer[3] = 'c';

等同于

char_pointer += 3; char_pointer = 'c';

第二个例子...我不认为你这样做是有效的。


0
请注意,您发布的代码中没有任何初始化。尽管如此,您应该记住数组会衰减为指针(指向数组内第一个元素的指针)。获取数组的地址是完全有效的,但现在您有了一个(*char)[10]而不是char*

1
数组(即数组类型的表达式)在大多数情况下会衰减为指针(正如您隐含地承认的那样)。 例外情况包括:一元&运算符的操作数,一元sizeof运算符的操作数以及用于初始化数组对象的初始化程序中的字符串字面量(例如,char s [] ="hello";)。 - Keith Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接