C语言强转数据类型为指针类型的解析

  对于数据类型的强转是很常见的事,比如将整型的数强转为长整型,这些都很常用,但是在C语言中存在强转数据类型为指针类型,这个在有些地方让我在很疑惑,比如指针指向NULL。下面讲讲我的理解

  在C语言中NULL被宏定义为(void *)0,以char *c = NULL为例,c指向(void *)0表示什么意思? 实际上这个0表示人为确定的地址0(因为指针指向的是地址,所以一个数是指针类型,那么这个数就应该表示地址,如同一个数为int型,那么这个数就表示整数)

  在C语言中人为确定地址叫做绝对定址,比如(void *)0就叫做以0为首地址的绝对定址,绝对定址对应的具体所占用的内存大小取决于指针的数据类型占据的内存大小,以下面代码为例子,以0为首地址的空间大小取决于Teacher数据类型占据的大小,这块地址空间含有name数组和age变量,可以得到age和name数组相对于0地址的偏移量

  对于地址强转的意义,就是为了告诉编译器这块地址空间含有哪些成员,如果不强转,编译器也会隐式的强转,以下面malloc函数为例,如果不强转也不会有什么问题,因为我们使用时把这块内存当作数组,那么编译器会自动识别元素类型为字符指针类型。但是为了确定规范起见,应该强转类型以此来确定内存中含有哪些成员

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Teacher
{
    char name[10];
    int age;
}Teacher;

int main(void)
{
    //0转成指针类型,所以表示一个0地址,对应的地址空间是一个Teacher指针指向的空间,这个地址空间存在name数组和age变量
    int n = (int)&((Teacher *)0)->age;
    printf("%d\n",n);

  int n1 = (int)&(Teacher *)10)->age;
  printf("%d\n",n1);
//定义一个堆内存指针数组,强转返回的首地址类型为char ** 表示这个地址空间是一个指针数组
    char **ch = (char **)malloc(3 * sizeof(char *));
    if (ch != NULL)
    {
        free(ch);
        ch = NULL;
    }

    printf("\n");
    system("pause");
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/songtothesun/p/9902257.html