c语言结构体指针动态存储空间,C语言-(指针、动态分配内存、结构体、创建文件)...

心得体会

今天是c语言学习的最后一天,我们终于学到了指针部分。整天课下来我是听得云里雾里的,大脑并不能很快的反应过来,尤其是最后编写demo的部分,对我来说很是困难,可以说上课的时候我几乎完全没有听懂。但是,有时候人真的是愈战愈勇,虽然真的很困难,但是我还是要尽全力去把他搞懂,说不定,接下来将会海阔天空呢^^.

技术

指针

c语言动态分配内存

结构体

将结构体写入文件

操作以及操作详解

指针

1.什么是指针

其实指针就像是其它变量一样,所不同的是一般的变量包含的是实际的真实的数据,而指针包含的是一个指向内存中某个位置的地址。

2.为什么要使用指针

a.指针解决跨区域(不同作用域 不同代码块)之间的数据交互

b.为函数提供修改调用变元的灵活手段;

c.支持C 语言动态分配子程序

d.可以改善某些子程序的效率

e.为动态数据结构(如二叉树、链表)提供支持

3.指针中符号-------------'*'表示的含义

a.声明定义变量的时候 表示一个指针变量

int*a//定义指针变量

int *temp=&c//定义指针变量

b.除了定义指针变量之外 都是访问个地址的值

*temp=21;//访问temp地址里面的数据 赋值为21

4.指针的使用注意事项

a.int *a;此时定义一个指针变量,指向的内存空间只能存放整数

b.定义指针变量的时候一定要赋初值

c.

float b=20;

int c=10;

int *a=b; //错误;指针变量只能存地址,不能存具体值***a=&b)`

int *a=&b;//错误 整形指针只能存整形数据的地址

int *a=&c;//正确

float *d=NULL;//NULL指向内存的首地址 0x00

d.

#include

int test(int a){

return 0;

}

int main(int argc, char *argv[])

{ int a=10;

int *pa=&a;

int a2[10]={};

int *pa2=a2;

int(*pFunc)(int )=test;//这是一个函数,函数的函数名实际上就是这个代码在内存中的首地址,所以test前面不加&

printf("%lu\n",sizeof(a)); //4

printf("%lu\n",sizeof(*pa));//8

printf("%lu\n",sizeof(a2));//40

printf("%lu\n",sizeof(*pa2));//8

printf("%lu\n",sizeof(pFunc));//8

//sizeof判断某一种类型在内存里面占据的内存空间是多少

system("pause");

return 0;

}

5.指针与数组的关系

a.数组名并不是 一个变量 没有分配内存空间 int a=10;指针变量是有内存空间的

b.定义一个数组,系统会分配内存空间;定义一个指针变量 只为变量本身分配8个字节内存空间

#include

int main(int argc, char *argv[])

{int score[5]={39,32,34,67,89};

printf("%p\n",score);

printf("%p\n",&score);

system("pause");

return 0;

}

9f4a0587cf73

QQ截图20190803225355.png

从上述结果可以看出两种输出结果是一样的,故由此可得:数组名其实就是数组的首地址

int score[5]={39,32,34,67,89};

for(int i=0;i<5;i++){

printf("%d ",score[i]);

}

for(int i=0;i<5;i++){

printf("%d ",*(score+1));

}

9f4a0587cf73

QQ截图20190803231800.png

int score[5]={39,32,34,67,89};

printf("%p\n",score);

printf("%p\n",score+1);

printf("%d\n",*(score+1));

printf("%d\n",*score+1);

9f4a0587cf73

QQ截图20190803232146.png

int score[5]={39,32,34,67,89};

printf("%d\n",(*score)++);

printf("%d\n",score[0]);

printf("%d\n",++*score);

9f4a0587cf73

QQ截图20190803232445.png

注意!!!

这里有一个坑,第一次打印是39,第一次打印过后就加1变成了40,所以第二次打印是40;

c语言动态分配内存

a.自己分配的内存必须自己释放,普通变量的内存是系统自己分配, 所以系统自己负责释放

b.步骤:创建了一个内存空间--->判断分配是否成功--->当之前分配的内存空间多了或少了 ,就需要在之前前的基础上重新分配--->内存空间用完后需立刻释放内存空间

char *pName=malloc(10*sizeof(char));//创建了一个内存空间

if(pName==NULL){//判断分配是否成功

//r如果分配失败

return;(exit(EXIT_FAILURE))

}

pName[0]='j';

pName[1]='a';

pName[2]='c';

printf("%s",pName);

//当之前分配的内存空间多了或少了 就需要在职期前的基础上重新分配

//realloc 必须是之前使用malloc分配过的

pName=realloc(pName,4*sizeof(char));//重新分配内存空间

pName[3]='k';

free(pName);//用完了就要自己释放内存

结构体

什么是结构体

结构体是一种数据类型 复合数据类型

//声明一种类型 struct Person

struct Person{

char name[10];

char *addr;

int age;

};

//定义结构体变量 变量名为xw

struct Person xw;

xw.name="小王";//错误!!!

xw.name[0]='x';//正确

数组一旦定义 地址不能改变;

不能直接给数组赋值;

将结构体写入文件

a.运行思路

把什么东西写到文件里---这个东西有多大---写到哪里去---写几个

1.把结构体写到文件

步骤:打开电脑的cmd---将你想要写的文件的地址的任意一个文件拖到cmd中----将文件名改为你所要创建的文件名----得到文件的完全路径---把完全路径写入fopen()中

#include

int main(int argc, char *argv[])

{

FILE *fp=fopen("C:/Users/Administrator.000/Desktop/abcd.txt","w");

struct Student{

char name[10];

int age;

};

struct Student xw1={"xiaowang",20};

fwrite(&xw1,sizeof(struct Student),1,fp);

system("pause");

return 0;

}

9f4a0587cf73

K)3IUNYPHB[]~NEMMPXPW~Q.png

9f4a0587cf73

RZBDXGF{U0AJD3~JHN()DXC.png

2.接下来以只读方式打开文件

int main(int argc, char *argv[])

{

FILE *fp=fopen("C:/Users/Administrator.000/Desktop/abcd.txt","r");

struct Student{

char name[10];

int age;

};

struct Student xw1;

fread(&xw1,sizeof(struct Student),1,fp);

printf("name:%s\n",xw1.name);

printf("age:%d\n",xw1.age);

fclose(fp);

system("pause");

return 0;

}

9f4a0587cf73

QQ截图20190804001929.png

在调用 fopen() 函数时,这些信息都必须提供,称为“文件打开方式”。最基本的文件打开方式有以下几种:

9f4a0587cf73

QQ截图20190804144435.png

文件一旦使用完毕,应该用 fclose() 函数把文件关闭,以释放相关资源,避免数据丢失。fclose() 的用法为:

int fclose(FILE *fp);

fp 为文件指针。例如:

fclose(fp);

文件正常关闭时,fclose() 的返回值为0,如果返回非零值则表示有错误发生。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值