目的
初步掌握C语言指针和结构体的定义和使用
指针
指针的灵活运用使得c语言更加强大,指针是C语言中十分重要的部分,可以说指针是C语言的灵魂。
为什么要使用指针
指针可以解决跨区域(不同作用域 不同代码块)之间的数据交互,同时使用指针
能够创建动态数据结构。这时内存将在程序运行的时候从堆上分配,而不用一开始就声明数组的最大规模。这样您就可以为每个文档准确地分配内存而不会产生浪费。而且,关闭一个文档时您还可以把它占用的内存返回给堆,以供程序的其他部分使用。使用指针,内存就可以在程序运行期间不断被回收利用。
指针的使用
定义指针变量与定义普通变量非常类似,不过要在变量名前面加星号*,格式为:
datatype *name;
或者
datatype *name = value;```
*表示这是一个指针变量,datatype表示该指针变量所指向的数据的类型 。例如:
int *p1;
p1 是一个指向 int 类型数据的指针变量,至于 p1 究竟指向哪一份数据,应该由赋予它的值决定。再如:
int a = 100;
int *p_a = &a;
在定义指针变量 p_a 的同时对它进行初始化,并将变量 a 的地址赋予它,此时 p_a 就指向了 a。值得注意的是,p_a 需要的一个地址,a 前面必须要加取地址符&,否则是不对的。
和普通变量一样,指针变量也可以被多次写入,只要你想,随时都能够改变指针变量的值,请看下面的代码:
//定义普通变量
float a = 99.5, b = 10.6;
char c = '@', d = '#';
//定义指针变量
float *p1 = &a;
char *p2 = &c;
//修改指针变量的值
p1 = &b;
p2 = &d;
注意:指针指向的内存空间只能在存放定义数据类型的数,同时定义指针变量的时候一定要给初值 不确定就给NULL;NULL指向内存的初始地址0x00。
数组和指针之间的关系
定义一个数组 系统会分配内存空间 可以存值
定义一个指针变量 只为变量本身分配8个字节内存空间无法存值,因为系统没有为他分配内存空间。
那如果想给指针指向的区域赋值,应该怎么办呢?
1.指针变量已经指向某块区域
int a3 = 10;
int *pa = &a3;
*pa = 30;
2.指针指向一个数组
int num2[10]= {};
int *pNum = num2;
3.动态分配内存 malloc realloc
上面两种指向的内存都是别人的,现在分配一个属于自己的内存空间,而自己分配的内存空间必须自己释放,普通变量的内存是系统自己分配 ,所以系统自己释放当分配的空间不够了,需要在之前的基础上重新分配用realloc函数但必须是之前用malloc函数进行过动态分配的 系统自己分配的内存则不能使用realloc来重新分配内存,同时一旦用完了,便自己释放内存。
malloc():
int *pNumber = (int*)malloc(100); // 分配100字节内存
int *pNumber = (int*)malloc(25*sizeof(int)); //存储25个int值得内存
用 if 语句检查是否分配:
int *pNumber = (int*)malloc(25*sizeof(int));
if (!pNumber)
{
// 内存分配失败的处理代码
}
释放动态分配的内存:
free(pNumber);
pNumber = NULL;
结构体
为什么要使用结构体
由于一个数组中只能存放同一种类型的数据,很不方便,所以C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,也就是结构体,把一些有共同特征(比如同属于某一类事物的属性)的变量封装在内部,通过一定方法访问修改内部变量。
结构体的使用
声明一个结构体类型的一般形式是
stuct 结构体名
{成员列表};
例如先声明结构体类型,再定义该类型变量:
{
int num;
char name[20];
char sex;
int age;
}
struct student S1,S2;
或者在声明定义的同时定义变量:
struct student
{
int num;
char name[20];
char sex;
int age;
}S1,S2;
结构体变量的初始化和引用
#include <stdio.h>
int main()
{
struct student
{
char name[20];
int age;
};
struct student XW1={"zhangsan",18};
printf("name:%s age:%d\n"XW1.name,XW1.age);
return 0;
}
今日小结
今天所讲的内容可能是整个C语言中最难的一块了,不管是动态分布内存,还是调用文件,链表都听的一知半解,有的时候走神几分钟,就有点无法跟上进度,好在今天是C语言的最后一天,有充分的时间,对今天的内容进行整理和回顾。