我很困惑
此代码段中发生了什么:
int *a;
a = 1;
*a = 1;
与这一个:
int b;
b = 2;
*b = 2;
答案 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)
第一个:
a
声明为指向int
第二个:
b
声明为int
无论哪种方式,引用(*
运算符)随机int值都不是一个好主意,可能会导致程序崩溃。