刚刚用C中的指针尝试了简单的smth,这很令人困惑

时间:2017-09-29 10:37:56

标签: c pointers

我想探索一下会发生什么,如果你把一个值传递给指针的地址而没有在之前声明地址本身。在声明之后,我将a的地址指定为指针本身的值。当我现在打印a的值时,无论是否更改数据类型或8的值,我总是将*ptr作为输出。为什么呢?

#include<stdio.h>
 int main(){
  int a, *ptr = 190;
  ptr = &a;
  printf(%d, a);
  return 0;
 }

输出: 8

小修正:数据类型确实很重要,有char和short,我总是0。使用intlong int等等,我始终8。使用double,我得到4200624。它仍然令人困惑。

1 个答案:

答案 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;
}