目的:
1.明白指针是什么
2.弄清指针的作用地位还有使用方法
3.指针的优缺点还有使用时的注意事项
4.学习如何定义一个结构体
5.初步使用结构体
指针:
解决跨区域(不同作用域 不同代码块)之间的数据交互
‘*’1.声明/定义变量的时候 表示一个指针变量
float b=20;
int c=10;
int*a;//定义一个指针变量 指向的内存空间只能存放整数
//注意:定义指针变量的时候一定要给初值 不确定就给NULL
int*a=b;//不行,指针变量只能存地址 不能存具体的值
int *a=&b;//不行,整型指针只能存整型数据的地址
int*a=&c;//可以
float *d = NULL;//NULL指向内存的起始地址 0x00
2.除了定义指针变量之外 都是访问某个地址的值
int *temp = &c;//定义指针变量l
*temp = 21; 访问temp地址里面的数据 赋值为21
3.动态分配内存 malloc realloc free
上面两种指向的内存都是别人的
希望分配一个属于自己的内存空间
自己分配的内存空间必须自己释放
普通变量的内存是系统自己分配 所以系统自己负责释放
char *pName = malloc(3 * sizeof(char));
//判断分配是否成
if(pName == NULL){
//分配失败
exit(EXIT_FAILURE);
}
pName[0] = 'j';
pName[1] = 'a';
pName[2] = 'c';
/* 当之前分配的内存空间不够了 就需要在之前的基础上重新分配
realloc 必须是之前使用malloc分配过的
如果是系统分配的内存 是不能使用realloc的
用完了就要自己释放内存*/
pName = realloc(pName, 4*sizeof(char));
pName[3] = 'k';
printf("%s\n", pName);
free(pName);
return 0;
}
结构体:结构体 是一种数据类型 复合数据类型
结构体的初步使用
//struct
//声明一种类型 struct Person == int
struct Person {
char name[10];
char *addr;
int age;
};
// int i1 = 10;
// struct Person zs = {"张三", 20};
//定义结构体struct Person变量 变量名xw
int i;
i = 20;
struct Person xw;
//xw.name = "小王";//数组一旦定义 地址不能改变
//不能直接给数组赋值
xw.name[0] = 'x';//系统为这个变量分配内存了
xw.name[1] = 'w';
//xw.addr = "西南大学";//常量字符串的地址是由系统分配的
//先为addr分配内存
xw.addr = malloc(4 * sizeof(char));
xw.addr[0] = 'S';//字符指针赋值 必须要有内存
xw.addr[1] = 'o';
xw.addr[2] = 'u';
xw.addr[3] = 't';
xw.age = 30;
printf("name:%s\n", xw.name);
printf("addr:%s\n", xw.addr);
利用结构体编写一个小系统
定义结构体部分
typedef struct Node{
char name[10];
int _id;
float score;
struct Node *next;
} Student;
//初始化一个头结点
void initHeader(Student **pHeader){
//动态分配内存
Student *pTemp = malloc(1 * sizeof(Student));
//初始化
pTemp->next = NULL;
//改变外部的值
*pHeader = pTemp;
}
插入功能代码
void insert(Student *pTemp){
//准备一个结构体 保存数据
Student *pStu = malloc(1 * sizeof(Student));
pStu->next = NULL;
//提示用户输入
printf("请输入姓名:");
scanf("%s", pStu->name);
printf("请输入成绩:");
scanf("%f", &(pStu->score));
//插入
int count = 0;
while (pTemp -> next != NULL) {
pTemp = pTemp->next;
count++;
}
//自动编号
pStu->_id = count+1;
//将当前这个学生添加到最后一个节点就可以了
pTemp->next = pStu;
}
void querry(Student *pTemp){
//指向第一个数据节点
pTemp = pTemp -> next;
while (pTemp != NULL ) {
printf("id:%d\n", pTemp->_id);
printf("name:%s\n", pTemp->name);
printf("score:%.1f\n",pTemp->score);
printf("\n");
pTemp = pTemp->next;
}
}
感悟:
指针是c语言的灵魂,因此学好指针是真的很重要,通过学习也感受到了指针的运用难度,还有他的一些重大作用。结构体是复合数据类型,所以判断它的占有内存是真的有难度。结构体的运用也是令人望而生畏,有些力不从心的感觉,链表真的是只懂一丝,总之努力就对了。