Android_开发_Day6_指针
Android_开发Day6指针
目的:
知道指针的概念,并学会使用指针。学会后在解决跨区域(不同作用域 不同代码块)之间的数据交互方面有很大的用途。
技术:
<1>什么是指针:指针就是地址,是内存中的地址,指针变量就是存放地址的变量,因此它的数据类型是不同于几大基本数据类型,是一种独立的数据类型。同时指针之间也是有数据类型的区分,比如flaot a; int *p=&a; 此时就会出错。综上指针变量,就是存放地址的变量,不可以对其类型不对的赋值,同时由于指针是指向内存中的某块,因此要注意在定义指针时要养成好的习惯,给指针赋初值。
<2>函数指针:函数指针是指向函数的指针变量,因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。
<3>指针变量的定义:数据类型 变量名 = 地址(可以用&具体变量或NULL);值得注意的是当指针定义完毕后如果不对其赋值则无法使用它所指向的内存的值。指针的赋值,如p=一个指针或地址,p=数值。
<4>函数指针的定义:返回值类型 ( * 指针变量名) ([形参列表]); 需要注意的是,函数指针无法进行++--运算。f=函数名。
<5>指针地址内容的访问:*(指针)就可以访问指针所指的内存空间的内容。指针变量本身所占的内存也是有地址的,它不同于指针变量所存的值,同时指针变量要占8个字节的内存空间。这里复习一下其他常见数据类型所占的内存空间:int4个(64位操作系统中) char1个。
<6>指针与数组的区别:我们常说的数组的名称就是一个指针,这个指针又与普通的指针有所不同,普通的指针里面有内存空间,而数组的首地址没有,其实数组的首地址就是该数组在内存中的首地址的别名。指针的下标与数组有些不同,如int p=a(假设a是一个数组名);该指针指向数组,p[0]等价于(p+0),同理p[1]等价于*(p+1)。
<7>动态分配内存:所谓的动态分配内存就是自己开辟一个内存空间,这个内存空间可以用来做你想要做的事情,开辟完后系统不会回收你的内存空间需要你自己回收内存。开辟内存空间可以用malloc函数。realloc函数用来重新分配内存,free用来释放内存。其中malloc函数有一个参数,即内存空间的大小,单位是字节,分配成功返回内存的地址,失败返回NULL。realloc函数的参数有两个,一个是需要重新分配的内存地址,二就是需要重新分配的内存的大小。该函数实际上是将你原有的内存拷贝一下然后新开一个再把原来内存的内容放进新开辟的内存空间中,并返回一个新的地址,因此也需要用一个指针去接住realloc返回过来的地址。注意:以上函数的使用需要导入stdlib.h
<8>结构体变量:就是将各种数据类型组合在一起所产生的一个新的数据类型。例如:我们可以定义一个Student类型,里面由学生的姓名char,学生的年龄int,学生的成绩float等等数据类型组成。在使用结构体变量的时候我们可以用变量名.具体的数据类型所定义的变量名。同时还可以用指针访问结构体变量,例如:
struct student
{
char name[10];
int age;
float score;
};
struct student zhangsan;
struct student *P = &zhangsan;
printf("%s",zhangsan.name);
printf("%d",zhangsan.age);
printf("%f",p->score);
结构体变量的初始化,可以直接用 结构体变量名={……,……,…………},表示依次对其赋初值,用逗号隔开。由于结构体变量的变量名太过长了,因此常用typedef来为其重新定义类型名称,相当于为该结构体类型起的一个别名。用法就是typedef 类型名 你要重新起的名;。
<9>文件操作:文件操作的操作包括:1.文件的打开 2.文件的关闭 3.文件的读取 4.文件的写入 。文件的打开用fopen("文件路径","读写方式")函数。读写方式包括:r只读 w只写 a追加(追加时是在文件的末尾加入) 如果要放二进制文件,只要在以上方式中末尾加个b即可。r+ w+ a+是即可读又可写的操作,其中不同的是w+如果目标文件不存在,则自动创建,而其余两种则会出错。文件的关闭用fclose(要关闭的文件指针/地址),文件的读取与写入分两种,一种是字符读写,二是二进制读写,字符读写单个用fgetc和fputc,字符串读写用fgets和fputs,二进制读写用fwrite和fread。具体参数和返回值还请自行百度。
技术如何使用:
比如:某校要开发一个学生管理系统,每个学生有学号,姓名,年龄,成绩,要求实现1.查询 2.插入 3.删除 4.修改。如何来实现这个功能,每个学生的信息可以用一个结构体变量来存储,但是这样关闭程序后信息就不在了,因此需要将这些信息存到文件中,这样本节的文件操作就可以用上了,由于学生众多,就需要大量的结构体变量,到底要多少,我希望根据实际情况要多少给多少,这样就要用到本节的动态内存开辟,同时用结构体数组来定义结构体不利于插入与删除,因此我们要用链表来定义结构体变量。
void insert()
{
student *p = (student*)malloc(sizeof(student));
p->next = NULL;
printf("请入学生的信息:\n");
printf("姓名:");
scanf("%s", p->name);
printf("年龄:");
scanf("%d", &(p->age));
printf("成绩:");
scanf("%f", &(p->score));
p->_id = 1001 + times;
if (p->_id == 1001)
{
head = p;
}
else
{
head->next = p;
}
printf("插入成功!\n");
}
插入函数,用了动态内存分配,与链表。
void print(student *phead)
{
if (phead == NULL)
{
printf("一个学生信息都没有哦!快去输入吧!\n");
}
else
{
while (phead != NULL)
{
printf("学号:%d\n", phead->_id);
printf("姓名:%s\n", phead->name);
printf("年龄:%d\n", phead->age);
printf("成绩:%f\n", phead->score);
phead = phead->next;
}
}
}
读取函数,读取内存的信息,将学生信息展示出来。
int _tmain(int argc, _TCHAR* argv[])
{
int choice;
do
{
_UI();
printf("请选择操作:");
fflush(stdin);
scanf("%d", &choice);
switch (choice)
{
case 1:
print(head);
printf("查询");
break;
case 2:
insert();
times++;
break;
case 3:
break;
case 4:
break;
default:
_exitprossce();
break;
}
} while (ask());
system("pause");
return 0;
}
这是主函数的内容,本人只是将结构打好了,还有一些具体功能没来得及实现,需要的可以参考一下结构就行,代码就不用了。