指针除了地址之外还有什么东西?[C]

Pum*_*ori 3 c arrays printf pointers format-specifiers

我现在一直在大学学习C几个月了,但是我错过了一个关于指针的讲座,所以我试着通过在线学习来弥补它,我以为我得到了它 - 但我偶然发现的东西是非常烦人的为了我.

我知道指针只包含他们指向的地址 - 例如,如果到目前为止我理解了所有内容,我有:

int *pointer;
int number = 30;
pointer = &number;
printf("Number at location: %d", *pointer);
Run Code Online (Sandbox Code Playgroud)

这应该没问题.我将变量号的地址分配给指针,然后通过解除引用指针并从地址获取实际值来最终打印它.令我恼火的是焦点指针.

我已经阅读了字符串数组/指针,所以我尝试了一些事情,当我注意到一些奇怪的东西(至少我的眼睛)发生了,也有int指针:

char* pointer;
char array[] = "Dingleberry";
pointer = array;
printf("%s\n", pointer);
return 0;
Run Code Online (Sandbox Code Playgroud)

我知道我不是直接分配地址,但是如果我没记错的话,使用数组,这不一定与指针结合 - 无论如何 - 这里的代码按预期工作,它打印出"Dingleberry".我现在的问题是......为什么?如果没有解除引用,指针不应只保存值的地址吗?如果我在这里取消引用,程序崩溃,它确实显示地址,如果我使用&虽然.

编译时我没有收到任何警告.此外,如果我使用它不应该工作:

printf("%c", pointer); 
Run Code Online (Sandbox Code Playgroud)

只收到一封信?(我的意思是,尝试这确实显示了一个警告 - 但我有兴趣变得更好并排除我最有可能的愚蠢错误观念.)

Iha*_*imi 8

它无关的指针类型或者存储,这是什么样"%s"的符printf()所期待指向AC串即指针功能nul字节终止序列.

如果要打印指针地址,请使用说明"%p"

printf("%p\n", (void *) &pointer);
Run Code Online (Sandbox Code Playgroud)

如果你想要它指向的对象的地址,在这种情况下只是数组

printf("%p\n", (void *) pointer);
Run Code Online (Sandbox Code Playgroud)

注意:对于通用指针使用,void *因为它可以在没有强制转换的情况下转换为任何指针类型.

  • @Pumamori:都不会 - 它很可能会导致运行时错误.首先,`*pointer1 =*pointer2`只会尝试用"Sun"的第一个字符覆盖``Monday``的第一个字符.其次,尝试更新*字符串文字*的内容会导致*未定义的行为*; 代码可能(并且很可能会)段错误,或者它可能按预期工作,或者它可能做其他事情并使您的系统处于不良状态.C中的字符串处理不直接或直观. (2认同)