目的
学习指针与结构体,理解其作用和使用方法以加深对C语言的理解和领悟;要明白指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址;要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区;而也要弄明白结构体也是一种数据类型,它由程序员自己定义,可以包含多个其他类型的数据,就跟int、float等一样
指针
指针是C语言显著的优点之一,指针使用起来十分灵活,而且能提高某些程序的编写效率,但是指针如果使用不当,很容易造成系统错误,许多程序的“挂死”的大部分原因都是由于错误地使用指针所造成的
使用指针的原因
指针可以解决跨区域(不同作用域 不同代码块)之间的数据交互,同时使用指针能够创建动态数据结构;这样就能使内存使用大大减少以减少浪费,从而使程序运行更流畅
指针的使用
如果有一个变量专门用来存放另一个变量的地址,则它被称为“指针变量”;而指针变量的定义方法与一般变量的定义方法相似,如下:
datatype *name;
其中,“*”表示这是一个指针变量,name即为定义的指针变量名,datatype表示本指针变量所指向的变量的数据类型
注意:定义指针变量的时候一定要给初值,不确定就给NULL
而给一个指针变量赋值可以有以下两种方法:
1.定义指针变量的同时就进行赋值
int a;
int *p = &a;
2.先定义指针变量,之后再赋值
int a;
int *p;
p = &a;
示例
#include <stdio.h>
int main()
{
int a, b;
int *p1, *p2;
printf("请输入苹果和香蕉的价格:\n");
scanf("%d,%d",&a,&b);
p1 = &a;
p2 = &b;
printf("苹果的价格为:%d/一斤\n",*p1);
printf("香蕉的价格为:%d/一斤\n",*p2);
return 0;
}
指针与数组的关系
定义一个数组 系统会给其分配内存空间,可以存值;而同时数组名并不是一个变量,系统不会给它分配内存空间
定义一个指针变量 系统只会为变量本身分配8个字节的内存空间,是无法存值的,因为没有为他分配可以存值的内存空间
如果想要给指针指向的区域赋值,有三种办法:
1.指针变量已经指向某块区域
int a3 = 10;
int *pa = &a3;
*pa = 30;
2.指针指向一个数组
int num2[10]= {};
int *pNum = num2;
3.动态分配内存 malloc realloc free
上面两种指向的内存都是别人的,而现在希望分配一个属于自己的内存空间;自己分配的内存空间必须自己释放,但普通变量的内存是系统自己分配,所以系统自己负责释放
char *pName = malloc(10 * sizeof(char));
//判斷分配是否成功
if(pName == NULL){
//分配失敗
exit(EXIT_FAILURE);
}
//當之前分配的內存空間不夠了 就需要在之前的基礎上重新分配
//realloc 必須是之前使用malloc分配過得
//如果是系統分配的內存 是不能使用realloc的
//用完了就要自己釋放內存
pName = realloc(pName, 4*sizeof(char));
free(pName);
结构体
普通数组是一组具有相同类型的数据的集合。但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组为字符,成绩为小数,因为数据类型不同,显然不能用一个数组来存放。于是我们便想到了结构体
结构体的使用
声明一个结构体的用法一般是:
struct 结构体名{
结构体所包含的变量或数组
};
结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员(Member)。
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
};
声明一种类型,struct 结构体名 ==int
struct stu{
char *name;
int num;
int age;
char group;
float score;
};
struct stu xw;
实际例子
#include <stdio.h>
int main(){
struct{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
} stu1;
//给结构体成员赋值
stu1.name = "Tom";
stu1.num = 12;
stu1.age = 18;
stu1.group = 'A';
stu1.score = 136.5;
//读取结构体成员的值
printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);
return 0;
}
心得体会
今天学习的知识十分地难懂,特别是后面的链表,听得确实是模模糊糊的,所以说还需要下来多回顾,不要只依赖于上课的时候,继续努力,刚好用明天休息的时间来解决自己不同的地方。