C语言 不完全类型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lixiaogang_theanswer/article/details/90765936

1、概念
不完全类型是指“函数之外、类型大小不能被确定的类型”。首次接触“不完全数据类型”概念是来自《征服C指针》的3.2.10章节。C的 类型 共分为:

(1)对象类型(char、int、数组、指针、结构体等)
(2)函数类型
(3)不完全类型

下图涵盖了c中的所有类型
在这里插入图片描述
不完全类型(incomplete types)有三种不同形式: void、未指定长度的数组以及具有非指定内容的结构和联合。void 类型与其他两种类型不同,因为它是无法完成的不完全类型,并且它用作特殊函数返回和参数类型。如下图:
在这里插入图片描述
以上截图来自 [cppreference.com]

因为“不完全类型”不能确定其大小(即所占用内存空间字节(内存地址偏移量)),所以是不能将其(不完全类型)变成 数组、结构体成员、变量 ,但是可以作为指针(或引用)使用,因为指针大小是确定的,4字节/8字节。

如下4个选项中,“(A)”编译是通不过的,因为 struct InCompleteTypeA 结构体的定义中,在 InCompleteTypeA m_a; 结构体成员 m_a 分号“;”处该定义还没有结束,所以此时的 struct InCompleteTypeA 还是一个不确定类型,在该结构体内的成员只能是 指向指针或引用。整个结构体的定义只有在最后一个“};”处才算结束。常见的 链表(单向链表、双向链表)、树(二叉树、红黑树等)的结构体定义中都是采用的 “不完全类型的指针”。

(A) struct InCompleteTypeA{ struct InCompleteTypeA m_a;};

(B) struct InCompleteTypeB{ struct InCompleteTypeB *m_Ptr;};

(C) struct InCompleteTypeC{ struct InCompleteTypeC &m_Ptr;};

(D)typedef struct InCompleteTypeC ICTypeD; struct InCompleteTypeE{ICTypeD &m_a;}; struct InCompleteTypeF{ICTypeD *m_a;};

1.1 声明
以下描述来自[Oracle Solaris Studio 12.2:C 用户指南]
某些声明可使用不完全类型,但是其他声明需要完全对象类型。需要对象类型的声明是数组元素、结构或联合的成员以及函数的局部对象。所有其他声明允许不完全类型。特别地,允许下列构造:
(1)指向不完全类型的指针
(2)返回不完全类型的函数
(3)不完全函数参数类型
(4)不完全类型的 typedef 名称
函数返回和参数类型特殊。除 void 之外,在定义或调用函数之前,必须完成以这种方式使用的不完全类型。返回类型 void 指定不返回值的函数,单个参数类型 void 指定不接受参数的函数。
由于数组和函数的参数类型重写为指针类型,因此表面上不完全的数组参数类型实际上并非不完全。main 的 argv 的典型声明(即 char *argv[],一个未指定长度的字符指针数组)重写为指向字符指针的指针

1.2 程序示例

Test.h 文件

#ifndef _TEST_H_
#define _TEST_H_
struct WomanTag;
struct ManTag{
        int mAge;
        struct  WomanTag *pWife;
};

struct WomanTag{
        int mAge;
        struct ManTag *pHusband;
};
#endif //_TEST_H_

Test.c 文件

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Test.h"

int main(int argc, char **argv)
{
    struct ManTag strMan;
    strMan.mAge = 26; 
    if(strMan.mAge >= 18) 
    {   
        struct WomanTag strWoman;
        strWoman.mAge = 26; 
        strMan.pWife = &strWoman;
    }   
    
    printf("Man:[age: %d] [wife age: %d]\n", strMan.mAge, strMan.pWife->mAge);
    return 0;
}

gcc编译: gcc Test.c -o test
打印结果: ./test

Man:[age: 26] [wife age: 26]














展开阅读全文

没有更多推荐了,返回首页