C语言中指针相关的问题

4
char *sample = "String Value";

&sample是指向指针"String Value"的指针。

上述语句是否正确?

如果上述语句正确,当我的声明为以下内容时,等效于&sample是什么?

char sample[] = "String Value"

1
sample[]是可重写的,而*sample不是。 - Jack
感谢大家的回答和评论。感谢 aJ 编辑并标记我的问题。这是我在这里的第一个问题,我觉得我喜欢这个网站和社区!d(^-^)b - din
5个回答

6
在第一个例子中,有两个对象被创建。
其中一个是名为samplechar *(指向char的指针),另一个是包含字符串字符的13个未命名的char数组。在这种情况下,&sample给出了对象sample的地址,该地址是指向指针的指针 - 因此是指向指针的指针。
在第二个例子中,只创建了一个对象;一个名为sample的13个字符的数组,用字符串的字符进行初始化。在这种情况下,&sample给出了对象sample的地址 - 因此是指向包含13个字符的数组的指针。
在第二个例子中,没有与第一个例子中的&sample相当的内容,就是指向指针的指针值。这是因为没有指向char的指针值可以获取其地址。只有数组存在。

谢谢caf。你真的值得拥有那 25000 的声望! - din
两个示例都有两个对象。它们都有字符串字面量(一个字符数组)。在第一个示例中,创建了一个指向字符串字面量的指针。在第二个示例中,创建了一个包含字符串字面量副本的数组。 - M.M

0

指针为程序员提供了巨大的能力和灵活性,但如果不正确处理,它们可能会导致制造商使用问题。考虑以下使用指针以防止错误的预防措施。我们应该确保在程序中知道每个指针指向哪里。以下是一些有用的常见错误和一般观察。

*ptr ++、*p []、(ptr).member

0
在第一部分中,&sample 将返回创建的 'sample' 指针的地址,在第二种情况下,将返回创建为对象的字符串的起始地址。

-1
在C语言中,数组和指针可以说是互换的。你可以像处理指针一样处理数组名,也可以像处理数组名一样处理指针。
当你对一个指针使用取地址符(&)时,你会得到一个指向指针的指针。

3
然而,使用 & 取地址时,有一种情况不能将数组名视为指针,反之亦然。 - caf
“more or less interchangeable”对于初学者实际上并没有澄清任何事情。(1)“同一件事”,并不等同于“有时声明为数组的变量会衰变为指向数组开头的指针”,(2)最好列出发生这种情况的情形。 - detly

-2

&sample是指向“字符串值”的指针地址。

对于第二个例子,由于没有后面的下标,数组名称被解释为指向数组初始元素的指针,这意味着

sample

&sample[0]

都是一样的,因此&sample也是指向字符串的指针地址。


这是不正确的。&sample不是指针的地址;它是数组的地址,与指针的地址无法互换。 - caf
在第二个例子中,sample 是一个数组。在某些情况下,它会自动衰减为指针,但区别很重要。(例如,sizeof samplesizeof &sample[0] 将不同。) - jamesdlin

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