Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 这些语句都会返回一个地址吗?_C_Arrays_Pointers_Memory Address - Fatal编程技术网

C 这些语句都会返回一个地址吗?

C 这些语句都会返回一个地址吗?,c,arrays,pointers,memory-address,C,Arrays,Pointers,Memory Address,表示您在C中有一个字符数组。如下所示: char array[]; 现在,下面哪项陈述将打印出地址。我知道1和2会,但3也会打印出地址吗 1) printf("Arrays adress is %x\n", array); 2) printf("Arrays adress is %x\n", &array[0]); 3) printf("Arrays adress is %x\n", &array); 假设数组将读取文本,并且声明将是char text[]=…某物。。。您将使

表示您在C中有一个字符数组。如下所示:

char array[];
现在,下面哪项陈述将打印出地址。我知道1和2会,但3也会打印出地址吗

1) printf("Arrays adress is %x\n", array);
2) printf("Arrays adress is %x\n", &array[0]);
3) printf("Arrays adress is %x\n", &array);
假设数组将读取文本,并且声明将是char text[]=…某物。。。您将使用%p而不是%x,并将传递给void*的值强制转换为:是的,将打印一些地址。

它们都没有。它们都将打印垃圾值,即程序的行为未定义

编辑:由于OP改变了他的问题,现在答案是:

它们都将使用%p说明符打印地址,并使用void*强制转换数组、&array和&array[0]中的每一个


不太可能,如果您想打印内存地址和指针值,我会使用正确的格式:

printf("The address is: %p\n", &array);
例如,%x将只打印作为相应参数传递的任何int的十六进制值。完成此操作后,所有三条语句的打印结果完全相同:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char foo[] = "Some string";
    printf("%p\n%p\n%p\n", (void *)foo, (void *)&foo, (void *)&foo[0]);
    return 0;
}
打印出同样的东西,三次。 正如H2CO3善意地指出的,您需要为printf转换一个空指针


通常,数组的计算结果为其第一个元素的地址。这就是为什么数组、&array和&array[0]都会产生相同的值

如果需要您的表达式来打印地址,则无。每个调用未定义的行为。%x用于打印整数值。%p用于打印指针。我认为最好将%x替换为%p,因为这是指针字符数组[]的正确格式;不会编译!它要么需要反斜体化,要么需要一个确定的元素数。@Zaibis:您似乎是正确的,因为gcc在这个不清楚的语句上是自治的,并假设数组只有一个元素。@alk不,我一点也不正确,我检查了它,发现它根本无效,它只是有效,如果初始化是在同一行中完成的。还要注意,由于printf是可变的,地址需要显式转换为void*。好的,如果我以正确的格式将&array更改为array,会发生什么情况?@user2426316很可能,&array和array在罩下具有相同的指针值,因为array会衰减为&array[0],这是第一个元素的地址。虽然标准中没有要求,但它几乎总是与数组本身的地址相同的数字。这是草率的措辞,因为指针不是整数,但你明白了。@user2426316:我在我的答案中添加了一个指向另一个SO问题的链接,你可能需要阅读。它处理数组和它们的地址。你可能因为罢工而被否决了,并且把你的答案塞进一句话里,让人很难理解。不过,我只是在猜测……第三个也是有效的、有效的吗?因为&array[0]等于array,所以我认为&array将与&array[0]相同,这是不正确的,不是吗?!如果是这样,我当然同意你的否决票,并对我的回答发表评论!但是你能解释一下为什么&&array[0]被解释为有效地址吗?@Zaibis;我没有否决投票。但是&array与&array完全不同。后者的类型为char**,而前者的类型为char*@haccks,但我说&array等于&&array[0]而不是&array等于&&array,两者都应该无效,因为array的声明是char array[x];。因为数组已经是数组的第一个元素的地址,那么第一个元素的地址是什么?那是无效的?!是吗?@Zaibis;看来你有大麻烦了。实际上&array[0]是数组的第一个元素0的地址。另一方面,array是整个数组的地址。两者都是不同的。@haccks我不太清楚,因为我不知道数组的地址和数组的第一个元素的地址有什么区别,因为我很确定我读过一些文章,其中都应该是相同的第一个元素地址和数组地址。我刚看了一下我的K&R ANSI C手册,注意到他们没有提到那个案例。因此,我现在必须深入研究ISO/IEC 9899。但我会让你知道我的研究。
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char foo[] = "Some string";
    printf("%p\n%p\n%p\n", (void *)foo, (void *)&foo, (void *)&foo[0]);
    return 0;
}