我在最后一行的某个地方犯了一个错误。它没有在地址上显示正确的值。
/* an array with 5 elements */
double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};
double backup[5];
double *p;
double address;
int i = 0;
memcpy(&backup, &balance, sizeof(balance));
p = backup;
/* output each array element's value */
printf( "Array values using pointer\n");
for ( i = 0; i < 5; i++ )
{
//printf("*(p + %d) : %f\n", i, *(p + i) );
printf("&p[%d] : %f\n", i, p[i]);
printf("&p[%d] : address: %p\n", i, (void*)(&p+i));
}
int offset = 4;
printf("Contents of &p[%d] : address: %x is %f\n", offset, ((&p)+(offset)), p[offset]);
double* newPointer;
newPointer = ((&p)+(offset));
printf("The content again: %f at address: %x\n", *(newPointer), newPointer);
//输出不正确
内容: 0.000000 ,地址:28feec
答案 0 :(得分:4)
从我说的打字开始,这就是:
newPointer = ((&p)+(offset));
应该是:
newPointer = p + offset;
此:
((&p)+(offset))
当你取double **
的地址时,返回double *
。添加到此任何偏移仍然留下double **
。您肯定不希望分配给double *
。
我在最后一行某处犯了错误
在“最后一行”之前,在p
地址的错误也是在其他几个位置进行的。
再次指出:
要打印出指针的值,请将其转换为void *
(如果已经不是),并使用p
转换说明符:
printf("The content again: %f at address: %p\n", *newPointer, (void *) newPointer);
使用x
或d
或i
可以减少一半地址的重要位数。
答案 1 :(得分:2)
double *p
;这里p
本身是一个地址定位指针p
。因此,在添加偏移量时,p + offset
以下是指针行为的图解表示。 p
是一个指向/保持backup
地址的指针。因此p
的地址为0x2000
,但&p
的地址为p
0x3000
。因此,&p + offset
会导致您的情况发生不同的内存位置。
p backup
+------+ +------+
| | | |
|0x2000|------------>|0x1000|
| | | |
+------+ +------+
0x3000 0x2000
也可以使用,
指针地址的 %p
格式说明符。
答案 2 :(得分:2)
memcpy(backup, balance, sizeof(balance));
p = backup;
printf( "Array values using pointer\n");
for ( i = 0; i < 5; i++ ){
//printf("*(p + %d) : %f\n", i, *(p + i) );
printf("p[%d] : %f\n", i, p[i]);
printf("p[%d] : address: %p\n", i, (void*)(p+i));
}
int offset = 4;
printf("Contents of p[%d] : address: %p is %f\n", offset, p+offset, p[offset]);
double* newPointer;
newPointer = p+offset;
printf("The content again: %f at address: %p\n", *newPointer, newPointer);