C中的地址增加和乘法

时间:2013-02-22 15:57:30

标签: c memory-management

有没有办法在C?

中添加两个内存地址或将内存地址与一个数字相乘?

如果是这样,怎么样?例如,假设我有地址:

void * p = (void *) 0x80000000;

我想乘以2或添加另一个地址,以更改变量的当前地址!

5 个答案:

答案 0 :(得分:1)

0x28ff44不是“变量的地址”p,它只是变量的值。由于变量是指针,因此该值是地址。您当然可以通过转换为/从整数来修改值,就像它是一个整数一样,但为什么要这样做呢?

这是一个使指针值加倍的愚蠢函数:

void * double_address(void *p)
{
   const intptr_t pi = (intptr_t) p;

   return (void *) 2 * pi;
}

答案 1 :(得分:1)

你不能有意义地 * 在C中一起添加两个地址,或者将地址乘以数字或其他地址。允许的两个操作是减去指向连续内存块的地址,并向地址添加正整数或负整数。将两个地址相乘或相加是没有意义的,因为结果不会产生有意义的地址。

<小时/> * 以这种方式思考:因为地址只是数字,并且因为数学可以让你自由地增加和增加数字,所以并不意味着数学运算的结果会产生任何有意义的结果。例如,您当然可以将机场跑道的长度(以英寸为单位)添加到飞机油箱的容量(加仑)中。你会得到一个数字作为这个奇怪计算的结果,但它仍然只是一个数字序列,在物理世界中没有任何意义。

答案 2 :(得分:0)

我唯一知道你可以做的是向指针添加一个整数值,这将导致指针在内存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)`

以我从未听说过的任何其他方式添加或增加地址。

答案 3 :(得分:0)

你能解释一下你想做什么吗?

您可以将变量复制到另一个指针,然后设置为设置第一个变量。

// 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的先前内容。

答案 4 :(得分:0)

在C中添加两个地址无效,并且很可能永远不会执行任何操作。您可能希望将OFFSET从一个指针添加到另一个指针,例如:

 char *ptr1 = ...;
 char *ptr2 = ...;   
 ptrdiff_t d = ptr1 - ptr2;
 char *ptr3 = ptr2 + d; 

[请注意,只有ptr1ptr2指向“同一个对象” - 即相同的分配或相同的数组或类似对象时,上述内容才正式有效。

将指针乘以另一个指针会更加毫无意义[原谅双关语!]。由于指针往往是相当大的数字,因此乘以两个指针的乘积也可能会溢出结果,使其更加无用。