美文网首页
[C指针]指针与结构体:什么是 “结构体 * 指针 = ( 结

[C指针]指针与结构体:什么是 “结构体 * 指针 = ( 结

作者: AkuRinbu | 来源:发表于2019-04-16 20:13 被阅读0次
结构体 * 指针 = ( 结构体 *) malloc( sizeof(结构体) ) 内存示意图
  • INT4 * p1的本质 : 需要在内存找个位置放地址

请给我在内存找个地儿
放得下一个地址就行了
其实我不管前面的是 INT4 还是 HELLO4
只要这个【类型】是你编译器可以读出来的就行
具体这个【类型】有多大都好、有再大都好
反正现在就给点空间能放得下一个地址就行

  • p1= (INT4 *) malloc (sizeof(INT4));的本质 : 需要在内存真正开辟空间放【类型】
为4个一组的int变量,申请动态分配四次
malloc(sizeof(int))
malloc(sizeof(int))
malloc(sizeof(int))
malloc(sizeof(int))

当然可以也可以是 malloc(sizeof(int) * 4)

那么为什么不能直接写
p1 = (int *) malloc(sizeof(int) * 4) 呢?

【在这里】当然可以这么写了,因为毕竟,
结构体INT4的第一个变量就是 int a,
恰好就是一个整型变量,并且恰好4个变量都是 int 变量;
这是我故意凑出来的例子。

【但是请想想看INT3_CHAR1】
对于一般的结构体而言,真实的情况是,
大部分的变量类型都不会完全一样的,
不会总是4个int一组,或者4个char一组,
如果真是这样,为什么不直接用数组呢,
结构体本来就适合各种各样类型的组合在一起。
  • 其实,不管 INT4本质是不是4个int变量一组,直接写sizeof(结构体类型) 并且 进行强制转换 (结构体 *),无论如何都一步到位,不会再错了,这就是 为什么要用 malloc(sizeof(结构体类型))

结构体 * 指针 = ( 结构体 *) malloc( sizeof(结构体) ) ;
p1= (INT4 *) malloc (sizeof(INT4));
p2 = (INT3_CHAR1 *) malloc (sizeof(INT3_CHAR1));

  • INT3_CHAR1 还是为了说明:结构体为了地址的对齐,会自动补充字节

完整源码

#include <stdio.h>
#include <stdlib.h>

typedef struct int4 {
    int a;
    int b;
    int c;
    int d;
} INT4;

typedef struct int3_char1 {
    int a;
    int b;
    char c;
    int d;
} INT3_CHAR1;

int main()
{
    INT4 * p1;
    p1= (INT4 *) malloc (sizeof(INT4));
    printf("sizeof(INT4): %d\n", sizeof(INT4));
    printf("&p1:%p\np1:%p\n", &p1, p1);
    printf("INT4\na:%p\nb:%p\nc:%p\nd:%p\n"
        ,&(p1->a),&(p1->b),&(p1->c),&(p1->d));
    
    INT3_CHAR1 * p2;
    p2 = (INT3_CHAR1 *) malloc (sizeof(INT3_CHAR1));
    printf("sizeof(INT3_CHAR1): %d\n", sizeof(INT3_CHAR1));
    printf("&p2:%p\np2:%p\n", &p2, p2);
    printf("INT3_CHAR1\na:%p\nb:%p\nc:%p\nd:%p\n"
        ,&(p2->a),&(p2->b),&(p2->c),&(p2->d));
    
    return 0;   
}

相关文章

  • C语言20 结构体指针

    C语言20 结构体指针 探测结构体指针的特性 ++、-- 加法与减法 指针相减 使用结构体指针 结构体指针一定要指...

  • [C指针]指针与结构体:什么是 “结构体 * 指针 = ( 结

    INT4 * p1的本质 : 需要在内存找个位置放地址 请给我在内存找个地儿放得下一个地址就行了其实我不管前面的是...

  • C语言基础及指针⑧文件IO

    接续上篇C语言基础及指针⑦结构体与指针在结构体与指针中 , 我们了解到结构体与java中的类相似 , 也是一种自定...

  • C语言-5、结构体

    写法一 写法二 写法三 结构体指针 结构体指针 与 动态内存开辟 结构体的数组 结构体与结构体指针 取别名 取别名...

  • 6.结构体相关

    一 C 结构体和结构体指针 eg1: 一 结构体里面定义函数 通过结构体指针访问结构体里面定义的函数。 eg2:

  • 结构体与结构体指针数组

    1.结构体定义与使用。 2.结构体指针 与 动态内存开辟。 3.结构体的数组。 4.结构体与结构体指针 取别名。 ...

  • 函数指针,联合体,枚举,结构体和结构体指针

    函数指针 联合体 枚举 别名 结构体 结构体指针

  • 指针与结构体(三)

    一、指针 除了Go的空指针是nil外,指针与C的指针基本相同,在此略过 二、结构体 语法结构: 使用方法:初始化:...

  • Go语言之结构体指针

    结构体本身属于值类型,可以通过指针操作结构体,编程引用类型的数据,通过new()创建指针 结构体指针

  • Golang 指针和结构体

    Golang 指针和结构体 于c语言相同,go中也有指针和结构体的概念。指针表示变量的内存地址,结构体用来存储同一...

网友评论

      本文标题:[C指针]指针与结构体:什么是 “结构体 * 指针 = ( 结

      本文链接:https://www.haomeiwen.com/subject/faeiwqtx.html