V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
awanganddong
V2EX  ›  程序员

c 语言帮忙解释下什么意思

  •  
  •   awanganddong · 2021-03-18 17:06:19 +08:00 · 1344 次点击
    这是一个创建于 1138 天前的主题,其中的信息可能已经有所发展或是发生改变。
    int main()
    {
        ListPtr L;  //这行代码不太明白什么意思
        L = (ListPtr)malloc(sizeof(Sqlist)); //这行大概是分配内存空间,对( ListPtr )不明白什么意思
        return 0;
    }
    
    12 条回复    2021-03-19 16:44:39 +08:00
    putaozhenhaochi
        1
    putaozhenhaochi  
       2021-03-18 17:11:37 +08:00 via Android
    找找 def ListPtr 的代码
    konar
        2
    konar  
       2021-03-18 17:13:30 +08:00
    看起来 ListPtr 可能是 Sqlist*
    找到 ListPtr 的定义看看
    virusdefender
        3
    virusdefender  
       2021-03-18 17:15:07 +08:00
    就是一个类型
    awanganddong
        4
    awanganddong  
    OP
       2021-03-18 17:17:39 +08:00
    ```
    #include <stdio.h>
    #include <stdlib.h>
    #define LIST_TNIT_SIZE 100
    typedef int ElemType;
    typedef enum Status
    {
    success,fail,fatal,range_error
    } Status;

    typedef struct Sqlist
    {
    ElemType *elem;
    int length;
    int listsize;
    } Sqlist,*ListPtr;//重命名并且定义一个结构体指针

    Status List_Init(ListPtr L)
    {
    Status status = fatal;
    L->elem = (ElemType *)malloc(LIST_TNIT_SIZE*sizeof(ElemType));
    if(L->elem!=NULL)
    {
    L->length=0;
    L->listsize=LIST_TNIT_SIZE;
    status = success;
    }
    return status;
    }
    //------------------插入函数-----------------
    void List_Input(ListPtr L)
    {
    int n;
    printf("请输入数据元素的个数(1 - 5):");
    while(1)
    {
    scanf("%d",&n);
    if(n>LIST_TNIT_SIZE||n<=0)
    printf("数据出错,请重新输入:\n");
    else
    break;
    }
    for(int i=0; i<n; i++)
    {
    printf("请输入第%d 个数据元素:",i+1);
    scanf("%d",L->elem+i);
    L->length++;
    }
    }
    //-------------------输出-----------------
    void print(ListPtr L)
    {
    printf("顺序表中的元素为:");
    for(int i=0; i<L->length; i++)
    {
    printf("%d ",*(L->elem+i));
    }
    printf("\n");
    }
    //--------------------插入------------------
    void List_Insert(ListPtr L)
    {
    int pos,data;
    printf("请输入插入元素的位置:");
    scanf("%d",&pos);
    printf("请输入插入元素的数值:");
    scanf("%d",&data);
    if(pos>=L->length)
    {
    *(L->elem+pos-1)=data;
    L->length+=pos;
    }
    else
    {
    for(int i=L->length; i>=pos; i--)
    {
    *(L->elem+i)=*(L->elem+i-1);
    }
    L->length++;
    *(L->elem+pos-1)=data;
    }
    }
    //---------------------主函数---------------
    int main()
    {
    ListPtr L;
    Status status = fail;
    L = (ListPtr)malloc(sizeof(Sqlist));
    List_Init(L);
    List_Input(L);
    print(L);
    List_Insert(L);
    print(L);
    //printf("%d",L->listsize);
    return 0;
    }
    ```
    整体代码是这个样子,但是我追 ListPtr L 没找到它的定义
    konar
        5
    konar  
       2021-03-18 17:18:21 +08:00
    ListPtr 看命名是一个指针类型,第一行定义了一个指针,但没有任何指向,第二行的(ListPtr)是强制类型转换,malloc 的返回类型是 void*,将其转换成了具体的指针类型
    konar
        6
    konar  
       2021-03-18 17:19:16 +08:00
    ```
    typedef struct Sqlist
    {
    ElemType *elem;
    int length;
    int listsize;
    } Sqlist,*ListPtr;//重命名并且定义一个结构体指针
    ```

    这里就是 ListPtr 的定义了,他就是 Sqlist 的指针
    awanganddong
        7
    awanganddong  
    OP
       2021-03-18 17:26:52 +08:00
    @konar 明白了

    那这个 ListPtr 后面跟的 L 是声明 long 类型吗
    还有就是 malloc 分配内存成功之后,返回的值是该内存地址的值。按我的理解是一个 16 地址,
    这里可以转化成具体指针类型是为了什么
    konar
        8
    konar  
       2021-03-18 17:29:34 +08:00
    @awanganddong

    L 是变量名
    返回的值是该内存首地址,分配的空间大小是一个 Sqlist 结构体大小,将其转成 Sqlist 的指针是为了方便取结构体内的成员
    awanganddong
        9
    awanganddong  
    OP
       2021-03-18 17:31:23 +08:00
    @konar 透彻了。 感谢各位
    awanganddong
        10
    awanganddong  
    OP
       2021-03-19 13:08:05 +08:00
    @konar 再请教你下面这段的意思。

    ```
    if(pos>=L->length) {
    *(L->elem+pos-1)=data;
    L->length+=pos; //这个不是应该++吗????
    } else {
    for (int i=L->length; i>=pos; i--) {
    *(L->elem+i)=*(L->elem+i-1); //循环位置移动,把 7 的位置,放到 8 的位置
    }
    L->length++;
    *(L->elem+pos-1)=data; //这个是赋值,这里又不太清楚了
    }
    ```
    konar
        11
    konar  
       2021-03-19 15:16:23 +08:00
    @awanganddong

    ++肯定不行,原本 length 为 5,要插入到 9,++的话结果不是成了 6 了吗,但+=也不太合适,不考虑数组容量不够也应该是 L->length=pos 啊
    *(L->elem+pos-1)=data 相当于 L->elem[pos-1]=data,给数组元素赋值
    awanganddong
        12
    awanganddong  
    OP
       2021-03-19 16:44:39 +08:00
    @konar 我妹老师布置的上机测试题,她不大明白。然后让我给讲下具体思路。
    然而我吃了没文化的亏。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5307 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 08:08 · PVG 16:08 · LAX 01:08 · JFK 04:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.