我可以把指针赋值给整型变量吗?就像下面这样。
“是否可以这样做?”
int *pointer;
int array1[25];
int addressOfArray;
pointer = &array1[0];
addressOfArray = pointer;
“是否可以这样做?”
int *pointer;
int array1[25];
int addressOfArray;
pointer = &array1[0];
addressOfArray = pointer;
如果没有显式的强制类型转换,即不行。
addressOfArray = (int) pointer;
还有一个注意事项:
6.3.2.3指针
...
6 任何指针类型都可以转换为整数类型。除非先前已经指定,否则结果是实现定义的。如果结果不能用整数类型表示,则行为未定义。结果不需要在任何整数类型的值范围内。
因此,结果并不能保证是有意义的整数值。
uintptr_t
而不是int
,因为它具有更少的实现定义行为。 - Lundin不行。
您试图将“指向int的指针”值分配给“int”变量。您肯定会得到编译器警告。您可以这样做:
int *pointer;
int array1[25];
int *addressOfArray;
pointer = &array1[0];
//The following commented lines are equivalent to the pointer assignment above and are also valid
//pointer = array
//pointer = &array[0]
addressOfArray = pointer;
在嵌入式编程中,这是经常使用的一种方法,但需要注意以下几点:
bufferControl.BufferType = DataBuffer | LastBuffer; bufferControl.TheAddress = (Address)&msgControl; bufferControl.Length = MAX_VAS_MESSAGE_SIZE; bufferControl.Transferred = 0;
由于Address
只是unsigned long int
的typedef,类似于OP的问题被提出。 - Throwback1986uint16_t assemble(int8_t lower, int8_t higher){return (higher<<8) | lower;}
,避免misra 11.3问题。 - ctrl-alt-delormemcpy(&addressOfArray, &pointer, sizeof(int));
这将直接复制底层字节并替换转换运算符,但我绝对不建议这样做,除非您确定在您的系统上sizeof(int) == sizeof(int *)
。
正如其他人所评论的那样,可以通过强制类型转换将指针转换为int
。虽然不建议这样做,但是可能会有坏处。
但是,除了int
之外,还有更多的整数类型。例如,我们有intptr_t
和uintptr_t
,专门用于此目的。
因此,您可以这样做,而且是100%安全的。
uintptr_t addressOfArray;
addressOfArray = (uintptr_t) pointer;
然后,如果你真的真的想要这样做(看不出为什么),你可以这样做:
int myInt;
if(addressOfArray <= INT_MAX) {
myInt = addressOfArray;
} else {
int
,因为在所有系统上,int
并不足够大以容纳指针(例如常见的LP64和LLP64模型)。而是应该使用intptr_t
。 - Adam Rosenfield