0

有没有办法在 C 中添加两个内存地址或将内存地址与数字相乘?

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

void * p = (void *) 0x80000000;

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

4

5 回答 5

1

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

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

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

   return (void *) 2 * pi;
}
于 2013-02-22T16:00:24.713 回答
1

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


*这样想:因为地址只是数字,而且因为数学可以让你自由地乘法和加法,并不意味着数学运算的结果会产生任何有意义的东西。例如,您当然可以将机场跑道的长度(以英寸为单位)与飞机油箱的容量(以加仑为单位)相加。由于这种奇怪的计算,你会得到一个数字,但它仍然只是一个数字序列,在物理世界中没有任何意义。

于 2013-02-22T16:00:42.267 回答
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)`

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

于 2013-02-22T16:00:57.400 回答
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之前的内容。

于 2013-02-22T16:03:08.727 回答
0

在 C 中添加两个地址是无效的,而且很可能永远不会做任何您想做的事情。您可能希望从一个指针到另一个指针添加一个偏移量,例如:

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

ptr1[请注意,以上仅在和指向“相同对象”时才正式有效ptr2- 即相同的分配或相同的数组或类似的]

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

于 2013-02-22T16:14:32.390 回答