c语言第三次作业

上节课我们学习了文件型指针的运用。这节课我们则学习了变量型指针和链表的学习的使用。还了解了free函数、malloc函数的应用

指向结构体变量的指针变量的定义形式与一般指针变量的定义形式相同,只是将其指向类型定义为结构体类型即可。例如:
        struct person
            { charname[20];
             char sex;
             int age;
             float height;
            };
       struct person *p;
则指针变量p,它可以指向struct person类型的结构体变量。

将一个指针变量指向一个结构体变量后,可以利用指向该结构体的的指针变量引用成员,如:
        (* 指针变量名).成员名
以上形式也常写成:
        指针变量名->成员名
其中,->为指向运算符,它是由符号“-”和“>”两部分构成的。指向运算符的优先级和成员运算符相同,也是最高一级。

§2 指向结构体数组的指针变量

指针变量可以指向整型、字符型、浮点型等基本类型数组。同样,指针变量也可以指向结构体类型的数组。

程序L13_2.C功能:使用指向结构体数组的指针变量。

#include <stdio.h>
void main()
{ struct person
{ char name[20];
char sex;
int age;
float height;
}per[3]={{ "Li Ping", ‘M ‘,20,175},
{"Wang Ling", ‘F ‘,19,162.5},
{"Zhao Hui", ‘M ‘,20,178}};
struct person *p;
for (p=per;p<per+3;p++)
printf("%–18s%3c%4d%7.1f\n ", p->name, p->sex, p->age, p->height);
}

§3 链表的概念

链表是动态数据结构中最基本的形式,它的规模大小可以根据需要进行动态变化,达到合理地使用存储空间。

链表有一个“头指针”变量,用来指向链表的第一个元素。链表中的每个元素都称为“结点”,结点包含两部分内容:一是实际的数据信息;二是下一结点的指针,。链表的最后一个元素置为“NULL”(空地址),标志链表结束。

一个结点可以用一个结构体类型来描述。结构体中包含若干成员,用来表示结点的数据信息。此外必须有一个成员是与结点类型一致的指针,用来指向后续结点。例如,一个链表的结点可以定义为以下的结构体类型:
        struct node
            { int data1;
             float data2;
             struct node *next;
            };
其中,成员next是指向结点的指针变量,它指向next所在的struct node结构体类型数据。

C系统的库函数中提供了动态申请和释放内存存储单元的函数。

(1)malloc函数

malloc函数的原型为:
        void *malloc(unsigned int size)

函数的功能是:在动态存储区域中分配一个size字节的连续空间。函数的返回值为指针,它的值是所分配的存储区域的起始地址。如没有足够的存储空间分配,则返回0(记为NULL)值。

(2)calloc函数

calloc函数的原型为:
        void *calloc(unsigned int n,unsigned int size)

函数的功能是:在动态存储区域中分配n个为size字节的连续空间,并将该存储空间自动置初值0。函数的返回值为指针,它的值是所分配的存储区域的起始地址。如分配不成功,则返回0值。

(3)free函数

free函数的原型为:
        void free(void *ptr)

函数的功能是:释放由ptr所指向的存储空间。ptr的值必须是malloc或calloc函数返回的地址。此函数无返回值。

#include<stdio.h>

int main()

{

FILE *fp;

if((fp=fopen("c://my/test.txt","r+"))==NULL)     ()

{

printf("文件没有正确打开,不能往下执行了. \n");

return(1);

}

}

文件型指针

#include<stdio.h>

int main()

{

int*ptr;   // 声明一个int指针

intval = 1;  // 声明一个int值

ptr= &val;  // 为指针分配一个int值的引用

intderef = *ptr;  // 对指针进行取值,打印存储在指针地址中的内容

printf("deref地址=%ld,值=%d\n",ptr, deref);

}

通过*操作符声明了一个int指针。接着我们声明了一个int变量并赋值为1。然后我们用int变量的地址初始化我们的int指针。接下来对int指针取值,用变量的内存地址初始化int指针。最终,我们打印输出变量值,内容为1。

第6行的&val是一个引用。在val变量声明并初始化内存之后,通过在变量名之前使用地址操作符&我们可以直接引用变量的内存地址。

第8行,我们再一次使用*操作符来对该指针取值,可直接获得指针指向的内存地址中的数据。由于指针声明的类型是int,所以取到的值是指针指向的内存地址存储的int值。

指针与数组

#include<stdio.h>

int main()

{

intmyarray[4] = {1,2,3,0};

int *ptr = myarray;

printf("ptr地址=%ld,值*ptr=%d\n", ptr,*ptr);

ptr++;

printf("ptr地址=%ld,值*ptr=%d\n", ptr,*ptr);

ptr++;

printf("ptr地址=%ld,值*ptr=%d\n", ptr,*ptr);

ptr++;

printf("ptr地址=%ld,值*ptr=%d\n", ptr,*ptr);

}

C语言的数组表示一段连续的内存空间,用来存储多个特定类型的对象。与之相反,指针用来存储单个内存地址。数组和指针不是同一种结构因此不可以互相转换。而数组变量指向了数组的第一个元素的内存地址。

一个数组变量是一个常量。即使指针变量指向同样的地址或者一个不同的数组,也不能把指针赋值给数组变量。也不可以将一个数组变量赋值给另一个数组。然而,可以把一个数组变量赋值给指针,这一点似乎让人感到费解。把数组变量赋值给指针时,实际上是把指向数组第一个元素的地址赋给指针。

指针与结构体

#include<stdio.h>

struct person {

intage;

char*name;

};

int main()

{

struct person first;

struct person *ptr;

first.age = 21;

char*fullname = "full name";

first.name = fullname;

ptr= &first;

printf("age=%d, name=%s\n",first.age, ptr->name);

}

#include<stdio.h>

#include <stdio.h>

#include <conio.h>

#include <string.h>

#include <stdlib.h>

main()

{

intcount,*array; /*count是一个计数器,array是一个整型指针,也可以理解为指向一个整型数组的首地址*/

if((array=(int *) malloc(10*sizeof(int)))==NULL)

{

printf("不能成功分配存储空间。");

exit(1);

}

for(count=0;count<10;count++) /*给数组赋值*/

array[count]=count;

for(count=0;count<10;count++) /*打印数组元素*/

printf("%d-",array[count]);

}

上例中动态分配了10个整型存储区域,然后进行赋值并打印。例中if((array=(int *) malloc(10*sizeof(int)))==NULL)语句可以分为以下几步:

1)分配10个整型的连续存储空间,并返回一个指向其起始地址的整型指针

2)把此整型指针地址赋给array

3)检测返回值是否为NULL

2、free函数

由于内存区域总是有限的,不能不限制地分配下去,而且一个程序要尽量节省资源,所以当所分配的内存区域不用时,就要释放它,以便其它的变量或者程序使用。这时我们就要用到free函数。

其函数原型是:

void free(void *p)

作用是释放指针p所指向的内存区。

其参数p必须是先前调用malloc函数或calloc函数(另一个动态分配存储区域的函数)时返回的指针。给free函数传递其它的值很可能造成死机或其它灾难性的后果。

注意:这里重要的是指针的值,而不是用来申请动态内存的指针本身。例:

int *p1,*p2;

p1=malloc(10*sizeof(int));

p2=p1;

……

free(p1) /*或者free(p2)*/

malloc返回值赋给p1,又把p1的值赋给p2,所以此时p1,p2都可作为free函数的参数。

malloc函数是对存储区域进行分配的。

free函数是释放已经不用的内存区域的。

malloc函数

malloc函数的原型为:

void *malloc (unsigned int size)

其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。还有一点必须注意的是,当函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为NULL并执行相应的操作。

时间: 2024-08-05 19:28:27

c语言第三次作业的相关文章

C语言——第三次作业

作业要求一 题目6-1 输出月份英文名 题目6-2 查找星期 题目6-3 计算最长的字符串长度 题目6-4 指定位置输出字符串 作业:C高级第三次作业(2)没有思路,知识点也没有明白,未完成. 作业要求二 题目6-1 输出月份英文名 1.设计思路 (1)主要描述题目算法 第一步:题目要求设计getmonth函数来返回输入的n相应月份的英文单词. 第二步:定义变量i,定义字符串数组,含有各个月份的英文单词. 第三步:使用for循环遍历数组,通过if判断来返回n相应的月份.因为输入的n为月份所以要大

2018C语言第三次作业

要求一 2.struct sk{int a; char *str)}*p;   p->str++ 中的++ 加向? ++加向srt的地址. 要求二 题目1-计算平均成绩 1.设计思路 (1)主要描述题目算法 第一步:定义整数型变量n(学生数量).i(循环变量)和浮点型变量average(平均成绩): 第二步:按照题目要求定义结构体student以及结构体变量s[10]和地址变量p: 第三步:使用地址和循环输入所有学生信息并在循环体内累加学生成绩: 第四步:将学生成绩和除以人数得到平均成绩输入:

关于C语言的问卷调查(作业三)

1.你对自己的未来有什么规划?做了哪些准备? 答:我对我未来的规划就是希望能够学有所用,将来可以从事有关IT方面的,跟自己的专业对口.为此现在我需要多看一些和这个专业有关的书籍,自学一些知识,多些一些代码. 2.你认为什么是学习?学习有什么用?现在学习动力如何?为什么?          答:我认为学习不仅仅是学会书本上的知识,如果只埋头于书本,那与书呆子又有何异?学习更重要的是向身边的人学习,学习做事,学习技能,学习更多书本上学不到的东西.学习不仅可以丰富我们的学识,还可以修养我们的品格,让我

C语言第六次作业

作业A: 1.编写函数int OddSum(int n)计算n个整数中所有奇数的和.其中n个数的值由用户从键盘上输入. #include <stdio.h> int main() { int n,i,a,sum=0; printf("你需要输入几个数:"); scanf("%d",&n); for(i=1;i<=n;i++) { printf("请输入你所输入的数:"); scanf("%d",&am

第三次作业问卷

看到一个问卷不错,拟作为第三次作业的部分内容. 你对自己的未来有什么规划?做了哪些准备? 答:未来走一步算一步,计划赶不上变化,充实自己的知识,多增加一点自己经验,比起知识,更重要的是社交. 你认为什么是学习?学习有什么用?现在学习动力如何?为什么? 答:学习,就是知道一些以前不知道的事.厉害的人有两点:观察力和文化底蕴,学习就是为了增加知识储备,尽量不出现书到用时方恨少的情况.目前的学习动力很缺乏,因为一到大学开始想着混. 你感觉自己什么事情做的比较成功?有什么经验? 答:并不知道,似乎没有什

第三次作业——结对编程

备注:蔡潇_031302601.叶志宇_031302628 功能分析: 这次作业第一个要求就是能够实现将Excel文件内容导入数据库,由于上学期进行数据库实践时使用的是Java语言,并且这次作业与数据库也有关系,于是乎我们就想通过Java来实现这个功能.在学习如何将Excel文件导入数据库的过程中我们发现JExcel这个API,这使得我们的Java编程更加轻松,相比与其他的语言. 第二个要求是要实现显示数据库中的数据,我们组的项目是Web端的,我们想,既然第一个要求都已经用Java实现了,第二个

魏昊卿——《Linux内核分析》第三周作业:Linux系统启动过程

魏昊卿——<Linux内核分析>第三周作业:Linux系统启动过程 一.实验部分 实验指导 使用实验楼的虚拟机打开shell 1 cd LinuxKernel/ 2 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 内核启动完成后进入menu程序(<软件工程C编码实践篇>的课程项目),支持三个命令help.version和quit,您也可以添加更多的命令,对选修过<软件工程C编码实践篇>

职业规划第三次作业

看到一个问卷不错,拟作为第三次作业的部分内容. 你对自己的未来有什么规划?做了哪些准备? 答: 学好大学四年的课程,并积极参加各种活动来锻炼自己的能力.在实习期间认真学习工作经验,学习经验然后争取能自己创业 好好交友,多读书, 你认为什么是学习?学习有什么用?现在学习动力如何?为什么? 答:学习是通过他人的言传身教了解知识,将他人的认识转化为自己的知识.学习能够取他人之长补己之短,丰富自己的认知,还避免了闭门造车和坐井观天的错误.现在的学习动力一般,因为新学知识对我来说比较陌生. 你感觉自己什么

第三次作业(毛涛和徐明艳)

第三次作业 题目: 请编写一个能自动生成小学四则运算题目的“软件”.让程序能接受用户输入答案,并判定对错.最后给出总共对/错的数量. 需求分析:      1. 该软件是针对学生有限的计算能力,计算效率,计算精确度而制作的软件: 2. 该软件可以进行简单的四则运算并进行判断: 扩展功能: 1. 程序可以出带括号的正整数四则运算,支持分数,除法保留两位小数. 2. 可以出表达式里含有负整数(负整数最小不小于-100)的题目,且负数需要带括号,用户输入的结果不用带括号. 设计:  根据四则运算法则本