有没有办法在 C 中添加两个内存地址或将内存地址与数字相乘?
如果是这样,怎么做?例如,假设我有地址:
void * p = (void *) 0x80000000;
我想乘以 2 或添加另一个地址,以更改变量的当前地址!
有没有办法在 C 中添加两个内存地址或将内存地址与数字相乘?
如果是这样,怎么做?例如,假设我有地址:
void * p = (void *) 0x80000000;
我想乘以 2 或添加另一个地址,以更改变量的当前地址!
该值0x28ff44
不是“变量的地址” p
,它仅仅是变量的值。由于变量是指针,因此值是地址。您当然可以通过转换为整数来修改该值,就好像它是一个整数一样,但是您为什么要这样做呢?
这是一个将指针值加倍的愚蠢函数:
void * double_address(void *p)
{
const intptr_t pi = (intptr_t) p;
return (void *) 2 * pi;
}
您不能有意义地*在 C 中将两个地址相加,或者将一个地址乘以一个数字或另一个地址。允许的两个操作是减去指向连续内存块的地址,以及将正整数或负整数添加到地址。将两个地址相乘或相加没有意义,因为结果不会产生有意义的地址。
我知道你唯一能做的就是向指针添加一个整数值,这将导致指针在内存中移动sizeof(pointertype)
。
例子:
int* ptr;
int arr[2];
//put some values in arr;
ptr = &arr[0];
ptr = ptr + 1; // will cause the pointer to move along in the array by `sizeof(int)`
以我从未听说过或见过的任何其他方式添加或增加地址。
你能解释一下你想做什么吗?
您可以将变量复制到另一个指针,然后设置为设置第一个变量。
// Creates new pointer with new address (why ?)
void* new_var_ptr = malloc( <size_of_p> );
// Copy content of "p" address to "new_var_ptr" address
memcpy( new_var_ptr, p, <size_of_p> );
// Set "p" content to NULL (optional)
memset( p, 0, <size_of_p> );
// Set "p" to NULL (optional)
p = NULL
那么“new_var_ptr”会指向p之前的内容。
在 C 中添加两个地址是无效的,而且很可能永远不会做任何您想做的事情。您可能希望从一个指针到另一个指针添加一个偏移量,例如:
char *ptr1 = ...;
char *ptr2 = ...;
ptrdiff_t d = ptr1 - ptr2;
char *ptr3 = ptr2 + d;
ptr1
[请注意,以上仅在和指向“相同对象”时才正式有效ptr2
- 即相同的分配或相同的数组或类似的]
将一个指针乘以另一个指针将更加没有意义[请原谅双关语!]。由于指针往往是相当大的数字,因此两个指针相乘的结果也很可能溢出结果,使其更加无用。