我已经在大学里学习了几个月的 C,但是我错过了一个关于指针的讲座,所以我试图通过在线学习来弥补它,我以为我明白了 - 但我偶然发现了一些东西对我来说非常烦人。
我知道指针只包含它们指向的地址 - 例如,如果到目前为止我理解正确,我有:
int *pointer;
int number = 30;
pointer = &number;
printf("Number at location: %d", *pointer);
这工作正常,应该如此。我将变量号的地址分配给指针,然后最后通过取消引用指针并从地址中获取实际值来打印它。令我恼火的是字符指针。
我已经阅读了有关字符串数组/指针的内容,所以我尝试了一些东西,当我注意到一些奇怪的事情(至少对我来说是这样)发生时,还有 int 指针:
char* pointer;
char array[] = "Dingleberry";
pointer = array;
printf("%s\n", pointer);
return 0;
我知道我没有直接分配地址,但如果我没记错的话,对于数组,这没有必要与指针一起使用 - 无论如何 - 这段代码按预期工作,它打印出“Dingleberry”。我现在的问题是……为什么?不取消引用的指针不应该只保存值的地址吗?如果我在这里取消引用,程序会崩溃,但如果我使用 &,它确实会显示地址。
编译时我没有收到任何警告。另外,如果我使用:
printf("%c", pointer);
只收到一封信? (我的意思是,尝试这样做确实会显示警告 - 但我有兴趣变得更好并排除我最可能的愚蠢误解。)
最佳答案
它与指针类型或其存储的内容无关,它是 printf()
函数的 "%s"
说明符,它需要一个指向的指针到 c 字符串,即 nul
终止的字节序列。
如果要打印指针地址,使用"%p"
说明符
printf("%p\n", (void *) &pointer);
如果你想要它指向的对象的地址,在这种情况下就是数组
printf("%p\n", (void *) pointer);
注意:对于通用指针,请使用 void *
,因为它无需强制转换为任何指针类型即可转换。
关于c - 指针持有地址以外的东西? [C],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34753474/