Closed. This question is off-topic. It is not currently accepting answers. Learn more
想改进这个问题吗?Update the question所以堆栈溢出的值小于aa>。
两年前关闭。
int main(){

    float arr[5] = {12.5, 10.0, 13.5, 90.5, 0.5};
    float *ptr1 = &arr[0];
    float *ptr2 = ptr1 + 3;
    printf("%f ", *ptr2); // outputs 90.5
    printf("%d", ptr2 - ptr1);  // outputs 3
    printf("%d",ptr2) ;

   return 0;
}

为什么最后一行没有打印3而不是一些随机值

最佳答案

这是c基本原理的一部分。ptr1可以表示为ptr1 = &arr[0]ptr1 = arr:这两种形式是等价的。此外,您的ptr2赋值可以表示为ptr2 = ptr1 +3ptr2 = &ptr1[3]
有问题的一行:

printf("%d", ptr2 - ptr1);

从另一个指针值中减去一个指针值,得到两个指针之间的“间隙”数,假设每个“间隙”的大小为afloat
下面的例子应该提供更多的见解使用intptr_t类型只是为了让我可以像操作简单的数字一样操作指针。
代码列表
#include <stdio.h>
#include <stdint.h>
#define OFFSET  (3)

int main(void)
{
    float arr[5] = {12.5, 10.0, 13.5, 90.5, 0.5};
    float *ptr1 = &arr[0];
    float *ptr2 = ptr1 + OFFSET;

    printf("%p %p\n", ptr1, ptr2);
    printf("sizeof(float):%ld\n", sizeof(float));
    printf("Distance between pointers (bytes):%ld\n", (intptr_t)ptr2 - (intptr_t)ptr1);
    printf("Distance between pointers (gaps):%ld\n", ptr2 - ptr1);


    return 0;
}

样本运行
0x7fffdc244800 0x7fffdc24480c
sizeof(float):4
Distance between pointers (bytes):12
Distance between pointers (gaps):3

如果你还没有,我强烈建议你买/租/借一本普拉塔的“C Primer Plus”,并在最后完成章节和测验中的所有练习。这一主题在本书的开头部分有详细的论述。

关于c - 为什么仅算术运算会打印出一个值,而不是正常的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46304060/

10-09 20:16