1. 内存4区
代码区:函数代码,存放在代码区,函数名就是这个函数的地址
全局区:全局的变量,字符串常量
栈区:系统开辟和释放
堆区:用户决定要开辟多大内存?装什么数据?使用完后还要不要继续使用? 用户自己需要决定开辟和释放
内存示意图:
#include<stdlib.h>
Int *p;
P=(int *)molloc(size);
//在堆区开辟size个字节的内存
//指针p指向这段内存
//用molloc去开辟的内存不会自动释放,需要手动释放
Free(p) //释放
Ps:
#include<stdlib.h> //动态内存分配头文件
molloc(size) //函数功能是开辟内存,在堆区中开辟size个字节的内存
molloc(6) //开辟6个字节的内存
molloc(sizeof(int)) //开辟4个字节的内存
(float *)molloc(4) //开辟4个字节的内存给(float *)类型的数据
2.链表
结点:每一个结点就是一块内存
数据:每一个结点里面存放数据
简单单链表实现代码:
#include<stdio.h>
#include<stdlib.h>
struct Node
{
int data; //数据域
struct Node* next; //指针域
};
struct Node* createList()
{
struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));
//headNode成为了结构体变量
//变量使用前必须初始化
//headNode->data=1
headNode->next = NULL;
return headNode;
}
//创建结点
struct Node* createNode(int data)
{
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
//打印链表
void printfList(struct Node* headNode)
{
struct Node* pMove = headNode->next;
while (pMove)
{
printf("%d",pMove->data);
pMove = pMove->next;
}
printf("\n");
}
//插入结点
void insertNodeByHead(struct Node* headNode,int data)
{
//创建插入的结点
struct Node* newNode = createNode(data);
newNode->next = headNode->next;
headNode->next = newNode;
}
//删除结点
void deleteNodeByAppoin(struct Node* headNode,int posData)
{
struct Node* posNode = headNode->next;
struct Node* posNodeFront = headNode;
if (posNode == NULL)
{
printf("无法删除链表不为空!");
}
while (posNode->data != posData)
{
posNodeFront = posNode;
posNode = posNode->next;
if (posNode == NULL)
{
printf("无法找到相关信息!无法删除!");
break;
}
}
posNodeFront->next = posNode->next;
free(posNode);
}
int main()
{
struct Node* list = createList();
insertNodeByHead(list, 1);
insertNodeByHead(list, 2);
insertNodeByHead(list, 3);
printfList(list);
deleteNodeByAppoin(list, 2);
printfList(list);
system("pause");
return 0;
}
具体视频教程:C语言单链表教程