声明的int与声明的指针之间的指针操作数

时间:2014-03-10 22:16:48

标签: c variables pointers

我很困惑

此代码段中发生了什么:

int *a;
a = 1;
*a = 1;

与这一个:

int b;
b = 2;
*b = 2;

4 个答案:

答案 0 :(得分:5)

int *a;
a = 1;
*a = 1;

a是一个指针,因此作业a = 1无效。 (在C标准术语中,它是一个“约束违规”,需要诊断。)您的编译器必须至少打印一个关于此分配的警告;它应该完全拒绝它。 (有些编译器可能会插入一个隐式转换,就像你写了a = (int*)1一样;你不应该依赖它。)

int b;
b = 2;
*b = 2;

b不是指针,因此*b无效。同样,您的编译器必须诊断错误,而应该拒绝您的程序。

在这两种情况下,代码在C中都没有明确的含义。

答案 1 :(得分:2)

与基思和其他人略有不同......

在第一种情况下,您已将a声明为int的指针;这意味着变量a用于保存内存中整数对象的地址。为a分配新值意味着您要告诉a指向其他对象;为*a分配新值意味着您正在为a指向的事物写入新值。

正如Keith和其他人所提到的,你不能直接为指针对象分配一个非零整数值;类型不兼容。如果你写了

a = (int *) 1;

然后你会说你希望a指向从地址0x00000001开始的整数对象,由于多种原因,它不太可能是大多数平台上的有效内存地址。写

*a = 1;

表示您希望将整数值1分配给a指向的位置; IOW,你说你希望地址0x00000001的整数对象包含整数值1(同样,这很可能不起作用; 0x00000001很可能是“受保护的“地址,以及大多数系统喜欢在多个2或4的地址上对齐多字节数据类型”。

在第二种情况下,您已将b声明为int;这意味着变量b意味着保存有符号整数值。由于b不是指针类型,因此表达式*b无效;编译器将完全拒绝该表达式。

但是,您可以将两个片段组合在一起:

int *a;
int b;
a = &b;
*a = 2;

表达式&b为我们提供变量b的地址;表达式的类型是int *。因此,我们将变量b的地址存储在变量a中。然后,我们可以通过表达式 b*a分配值; *a = 2;相当于b = 2;

答案 2 :(得分:1)

int *a;
a = 1;

最后一个语句不是C.您不能将整数值(0除外)分配给指针对象。

int b;
b = 2;
*b = 2;

最后一个语句不是C.你不能取消引用非指针类型的对象,

答案 3 :(得分:0)

第一个:

  1. a声明为指向int
  2. 的指针
  3. 为其指定值2(作为地址)
  4. 将1分配给内存空间中地址2中的整数
  5. 第二个:

    1. b声明为int
    2. 为其指定值2
    3. 编译器将拒绝,因为b不是* int
    4. 类型

      无论哪种方式,引用(*运算符)随机int值都不是一个好主意,可能会导致程序崩溃。