我想探索一下会发生什么,如果你把一个值传递给指针的地址而没有在之前声明地址本身。在声明之后,我将a
的地址指定为指针本身的值。当我现在打印a
的值时,无论是否更改数据类型或8
的值,我总是将*ptr
作为输出。为什么呢?
#include<stdio.h>
int main(){
int a, *ptr = 190;
ptr = &a;
printf(%d, a);
return 0;
}
输出: 8
小修正:数据类型确实很重要,有char和short,我总是0
。使用int
,long int
等等,我始终8
。使用double
,我得到4200624
。它仍然令人困惑。
答案 0 :(得分:0)
int a, *ptr = 190;
通常必须在编译时抛出一个警告,因为您尝试分配int
值来初始化指针。在我的编译器上,我得到了:
a.c:3:11: warning: incompatible integer to pointer conversion initializing
'int *' with an expression of type 'int' [-Wint-conversion]
int a, *ptr = 190;
^ ~~~
可能不是您想要的,为指针指定固定值具有非常特殊的用途。
printf(%d, a);
是一个错误,因为printf
第一个参数必须是char *
。你可能想写printf("%d"...)
。我的编译器说:
a.c:5:10: error: expected expression
printf(%d, a);
^
即使在这种情况下,整个程序也是未定义的行为,因为您正在尝试读取之前未分配的变量(a
通过指针ptr
)。 / p>
你可能想写一些类似的东西:
#include<stdio.h>
int main(){
int a, *ptr;// definition of two variables, one of type int, one of type pointer to int, both non initialized
ptr = &a; // ptr points to variable a (contains its address)
*ptr = 190; // assignment of the variable pointed by ptr
printf("%d\n", a); // should print 190 as the content of a has been previously assigned
return 0;
}