c - 将整数类型转换为指针时出现整数指针赋值故障

标签 c pointers

#include <stdio.h>
int main (void) {

    int *a = (int *) 60;
    int *b = (int *) 40;
    printf("%lu\n", (a-b));
    printf("Integer Size = %lu\n", sizeof (int));
    printf("Pointer Size = %lu\n\n", sizeof (int *));

    char *c = (char *) 60;
    char *d = (char *) 40;
    printf("%lu\n", (c-d));
    printf("Character Size = %lu\n", sizeof (char));
    printf("Pointer   Size = %lu\n", sizeof (char *));

    return 0;
}

输出:

5
Integer Size = 4
Pointer Size = 8

20
Character Size = 1
Pointer   Size = 8

请解释输出。我无法理解的是 int *a = (int *) 60; 的作用?

最佳答案

int *a = (int *)60;

a声明为一个指向整数的指针,并将其设置为内存位置60。

int *b = (int *)40;

b 声明为一个指向整数的指针,并将其设置为内存位置 40。

当您对指针执行算术运算时,算术运算是以整数指向的数据类型的大小为单位进行的。所以

a - b

计算 ab 之间整数个数的差值。由于整数的大小为 4 字节,地址之间的差异为 20 字节,因此结果为 20/4 = 5

在第二段代码中,由于使用的是char而不是int,所以指针指向的是1字节的数据,所以指针减法和减法是一样的他们的地址。

一般来说,如果你有两个指针

T *a;
T *b;

其中 T 是任何类型,那么

a - b

相当于:

((char *)a - (char *)b)/sizeof(T)

关于c - 将整数类型转换为指针时出现整数指针赋值故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36274445/

相关文章:

c# - 用指针改变内存内容?

c - 代码修改后,Microblaze 上的运行时间有所不同

c - 访问二维结构数组上的值

Python - 有人能告诉我这两行的作用吗?

c - 第一次 scanf 后无缘无故出现额外的行?

c - C程序中出现插入排序错误

c - Windows 上出现段错误,但 Linux 上没有(包括 GDB 信息)- C

c - 将 C 函数返回的 C 指针释放给 Fortran?

c - 错误 : request for member in something not a structure or union in this code

c - 根据条件(if 语句)动态或在堆栈上分配内存