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

2021-03-18 17:06:19 +08:00
 awanganddong
int main()
{
    ListPtr L;  //这行代码不太明白什么意思
    L = (ListPtr)malloc(sizeof(Sqlist)); //这行大概是分配内存空间,对( ListPtr )不明白什么意思
    return 0;
}
1499 次点击
所在节点    程序员
12 条回复
putaozhenhaochi
2021-03-18 17:11:37 +08:00
找找 def ListPtr 的代码
konar
2021-03-18 17:13:30 +08:00
看起来 ListPtr 可能是 Sqlist*
找到 ListPtr 的定义看看
virusdefender
2021-03-18 17:15:07 +08:00
就是一个类型
awanganddong
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
2021-03-18 17:18:21 +08:00
ListPtr 看命名是一个指针类型,第一行定义了一个指针,但没有任何指向,第二行的(ListPtr)是强制类型转换,malloc 的返回类型是 void*,将其转换成了具体的指针类型
konar
2021-03-18 17:19:16 +08:00
```
typedef struct Sqlist
{
ElemType *elem;
int length;
int listsize;
} Sqlist,*ListPtr;//重命名并且定义一个结构体指针
```

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

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

L 是变量名
返回的值是该内存首地址,分配的空间大小是一个 Sqlist 结构体大小,将其转成 Sqlist 的指针是为了方便取结构体内的成员
awanganddong
2021-03-18 17:31:23 +08:00
@konar 透彻了。 感谢各位
awanganddong
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
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
2021-03-19 16:44:39 +08:00
@konar 我妹老师布置的上机测试题,她不大明白。然后让我给讲下具体思路。
然而我吃了没文化的亏。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/762906

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX