c - 指针持有地址以外的东西? [C]

标签 c arrays pointers printf format-specifiers

我已经在大学里学习了几个月的 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/

相关文章:

arrays - 在ruby中获取多级数组的组合

c - 重新分配无效的下一个大小

c - 指针递增和解引用(需要左值错误)

c++ - 从函数返回后指针为 NULL

python - 为什么我的继承自 array.array 的类不起作用?

arrays - 我怎样才能操纵一个数组来产生最大的数字?

c - 如何将文件名添加到系统日志字符串?

c - 我应该如何设置以使用 GTK4 进行开发?

c++ - TCMalloc - 获取指针的分配大小

c - 具有多个 fork() 的语句