这个问题旨在成为整数和指针问题之间所有初始化/分配的常见问题解答条目。
我想编写代码,将指针设置为特定的内存地址,例如0x12345678. 但是当用 gcc 编译器编译这段代码时,我得到“初始化使指针从整数而不进行强制转换”警告/错误:
int* p = 0x12345678;
Run Code Online (Sandbox Code Playgroud)
类似地,这段代码给出了“初始化从指针生成整数而不进行强制转换”:
int* p = ...;
int i = p;
Run Code Online (Sandbox Code Playgroud)
如果我在变量声明行之外做同样的事情,消息是一样的,但说的是“赋值”而不是“初始化”:
p = 0x12345678; // "assignment makes pointer from integer without a cast"
i = p; // "assignment makes integer from pointer without a cast"
Run Code Online (Sandbox Code Playgroud)
使用其他流行编译器的测试也会给出错误/警告消息:
int不能用于初始化类型的实体int*”int*在间接级别上与int”不同。问题:上面的例子是有效的 C 吗?
还有一个后续问题:
这不会给出任何警告/错误:
int* p = 0;
Run Code Online (Sandbox Code Playgroud)
为什么不?
给定char的指针,可以执行以下操作:
char *s = "data";
Run Code Online (Sandbox Code Playgroud)
据我所知,这里声明了一个指针变量,为变量和数据分配了内存,后者被填充,data\0并且有问题的变量被设置为指向它的第一个字节(即变量包含一个可以的地址被解除引用).这简短而紧凑.
例如,给定指向int的指针,可以这样做:
int *i;
*i = 42;
Run Code Online (Sandbox Code Playgroud)
或者那个:
int i = 42;
foo(&i); // prefix every time to get a pointer
bar(&i);
baz(&i);
Run Code Online (Sandbox Code Playgroud)
或者那个:
int i = 42;
int *p = &i;
Run Code Online (Sandbox Code Playgroud)
这有点同义反复.使用单个变量时,它很小且可以容忍.但是,它并没有对多个变量进行多次使用,从而导致代码混乱.
有没有办法干燥简洁地写同样的东西?这些是什么?有没有更广泛的编程方法,可以完全避免这个问题?可能我不应该使用指针(笑话)或什么?