结构体指针
2.结构体指针的定义
如有以下结构体:
struct student{int id;char *name;char sex[4];}s1,s2,s3;
则可以定义指向struct student类型结构体的指针:
struct student *sp;
sp = &s1;//用结构体指针sp指向struct student类型的结构体变量s1.
#include<stdio.h>
typedef struct nodeDate
{
int a;
char name[20];
}node;
void main()
{
node n;//n是结构体变量
node* p = &n;//p是一个结构体指针
p->a = 20;//结构体指针通过箭头(->)进行访问。
printf("%d\n", n.a);
}
#include<stdio.h>
typedef struct nodeDate
{
int a;
char name[20];
}node;
void main()
{
node n[5] = {
{1,"aaa"},
{2,"bbb"},
{3,"ccc"},
{4,"ddd"},
{5,"eee"}
};
node* p[5] = {&n[3],&n[2]};
printf("%d\t%s\n", p[0]->a,p[1]->name);
}
#include<stdio.h>
typedef struct nodeDate
{
int a;
char name[20];
}node;
void main()
{
node n[5] = {
{1,"aaa"},
{2,"bbb"},
{3,"ccc"},
{4,"ddd"},
{5,"eee"}
};
node* p = n;
printf("%d\n",p->a);
printf("%d\n", (p+2)->a);
printf("%s\n", (p+2)->name);
printf("%d\t%s\n", (*(p+2)).a,(*(p+4)).name);
}
内存分配
1.动态内存分配:从堆区申请内存,自己使用。
2.通过函数进行申请:malloc、calloc、realloc。
3.从堆区申请的内存是通过指针进行管理的。
4.使用free函数进行释放。
5.优势:栈区的内存比较小,堆区的内存非常大。
6.在释放内存的时候,在free函数中填的指针,必须要指向内存的首地址。
#include<stdio.h>
#include<stdlib.h>
void main()
{
//赋值的条件:类型相同。
int* p = (int*)malloc(100);//100个字节 头文件是stdlib.h
*p = 10;
*(p + 1) = 20;
printf("%d\t%d\n", *p, *(p + 1));
free(p);//头文件是stdlib.h
int* p1 = (int*)malloc(sizeof(int) * 25);
for (int i = 0; i < 25; i++)
{
*(p1 + i) = i + 1;
}
for (int i = 0; i < 25; i++)
{
printf("%d\t", p1[i]);
}
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
//赋值的条件:类型相同。
int* p = (int*)malloc(100);//100个字节 头文件是stdlib.h
*p = 10;
*(p + 1) = 20;
printf("%d\t%d\n", *p, *(p + 1));
free(p);//头文件是stdlib.h
int* p1 = (int*)malloc(sizeof(int) * 25);
for (int i = 0; i < 25; i++)
{
*(p1 + i) = i + 1;
}
memset(p1, 0, sizeof(int) * 25);//逐字节赋值 头文件是string.h
for (int i = 0; i < 25; i++)
{
printf("%d\t", p1[i]);
}
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
int* p = (int*)malloc(sizeof(int) * 25);
for (int i = 0; i < 25; i++)
{
*(p + i) = i + 1;
}
p = (int*)realloc(p,sizeof(int)*50);//重新分配内存,不会初始化。
for (int i = 0; i < 50; i++)
{
printf("%d\t", p[i]);
}
p = (int*)realloc(p, sizeof(int) * 10);
for (int i = 0; i < 25; i++)
{
printf("%d\t", p[i]);
}
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
int* p = (int*)malloc(sizeof(int) * 25);
for (int i = 0; i < 25; i++)
{
*(p + i) = i + 1;
}
p = (int*)realloc(p, sizeof(int) * 10);
for (int i = 0; i < 25; i++)
{
printf("%d\t", p[i]);
}
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
int* p = (int*)malloc(sizeof(int) * 25);
for (int i = 0; i < 25; i++)
{
*(p + i) = i + 1;
}
p = (int*)realloc(p, sizeof(int) * 10);
for (int i = 0; i < 25; i++)
{
printf("%d\t", p[i]);
}
free(p);
p = NULL;
}
#include<stdio.h> #include<stdlib.h> #include<string.h> void main() { int* p = (int*)calloc(25, sizeof(int) * 25);//会默认初始化为0. for (int i = 0; i < 25; i++) { printf("%d\t", p[i]); } }
#include<stdio.h> #include<stdlib.h> int* fun() { //在函数里面申请的堆区内存,不会随着函数的结束而释放,需要手动释放。 int* p = (int*)malloc(sizeof(int)); return p; } void main() { int* p = fun(); *p = 123; printf("%d\n", *p); free(p); }
#include<stdio.h> #include<stdlib.h> int* fun() { //在函数里面申请的堆区内存,不会随着函数的结束而释放,需要手动释放。 int* p = (int*)malloc(sizeof(int)); return p; } void main() { int* p = (int*)malloc(sizeof(int) * 10); for (int i = 0; i < 10; i++) { p[i] = i + 1; } int* p1 = (int*)malloc(sizeof(int) * 10 * 2); for (int i = 0; i < 10; i++) { p1[i] = p[i]; } free(p); p = p1; for(int i = 0; i < 20; i++) { printf("%d\n",p[i]); } }
#include<stdio.h> #include<stdlib.h> int* fun() { //在函数里面申请的堆区内存,不会随着函数的结束而释放,需要手动释放。 int* p = (int*)malloc(sizeof(int)); return p; } void main() { int* p = (int*)malloc(sizeof(int) * 10); for (int i = 0; i < 10; i++) { p[i] = i + 1; } int* p1 = (int*)malloc(sizeof(int) * 10 * 2); for (int i = 0; i < 10; i++) { p1[i] = p[i]; } free(p); p = p1; for (int i = 0; i < 10; i++) { p[i+10]=11 + i; } for (int i = 0; i < 20; i++) { printf("%d\n", p[i]); } free(p); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律