复习C语言
一、复习C语言指针
一、复习C语言指针
#include <stdio.h>
#include <stdlib.h>
int *p = &i;//等价于int *p; p=&i;p指向i,*p就是i变量本身
/*如何通过被调函数修改主调函数中普通变量的值*/
void f(int *p){/*2.形参为相同变量类型的指针变量*/
//不是定义了名字叫做*i的形参,而是定义了一个形参,该形参名字叫做p,他的类型为int *
*p=100;/*3.在被调函数中通过 *形参变量名 的方式就可以修改主函数中变量的值*/
}
int main()
{
int i=9;
f(&i);/*1.实参为相关变量的地址*/
printf("i=%d\n",i);
return 0;
}
/*指针和数组*/
int main(){
int a[5]={1,2,3,4,5};//a是一个指针常量,a存放的是第一个元素的地址,它的值不能被改变,指向的是数组的第一个元素
a[3] == *(3+a);//元素和指针的关系a[i]==*(a+i)
printf("%d\n",a[3] == *(3+a));
printf("%p\n",a+1);
printf("%p\n",a+2);//表明地址是连续的,占4个字节
printf("%d\n",*a+3);//*a+3等价于a[0]+3
return 0;
}
/*如何通过被调函数修改主调函数中一维数组的内容*/
/*1.存放数组首元素的指针变量*/
/*2.存放数组元素长度的整型变量*/
void show_array(int * p,int len){
p[0]=-1;//p[0] == *p
p[2]=-1;//p[2] == *(p+2) ==*(a+2) == a[2] //p[i]就是主函数的a[i]
for(int i=0;i<len;++i){
printf("%d\n",p[i]);
}
}
int main(){
int a[5]={1,2,3,4,5};
show_array(a,5);//a等价于&a[0],&a[0]本身就是int *类型
printf("%d\n",a[0]);
printf("%d\n",a[2]);
return 0;
}
一、复习C语言结构体
一、复习C语言结构体
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student
{
int sid;
char name[200];
int age;
//结构体变量不能加减乘除,但是可以相互赋值
};//分号不可省
int main()
{
struct student st= {1000,"zhang",20};
st.sid=99;第一种方式
struct student *pst;
pst = &st;
pst->sid = 99; //第二种:pst->sid 等价于(*pst).sid 也就等价于st.sid;
// pst所指向的结构体变量中的sid这个成员
return 0;
}
//普通结构体变量和指针结构体变量作为函数传参的问题
void g(struct student st)
{
printf("%d %s %d\n",st.sid,st.name,st.age);
}
//耗时
void f(struct student *pst)
{
(*pst).sid = 99;
strcpy(pst->name,"zhang");
pst->age = 22;
printf("%d %s %d\n",pst->sid,pst->name,pst->age);
}
int main()
{
struct student st;
f(&st);
// g(st);
}
一、复习C语言malloc动态分配内存
一、复习C语言malloc动态分配内存
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int len;
printf("输入你需要分配的数组的长度:len=");
scanf("%d",&len);
int *pArr = (int *)malloc(sizeof(int) * len);//分配了20个字节 *是乘号
//malloc函数能且只能返回第一个字节的地址
//干地址转化成实际意义的地址就必须在malloc前面加(数据类型 *)
//int *告诉编译器把第一个字节的地址当做整型的地址
//pArr指向前4个字节 pArr+1表示指向后4个字节
// *pArr = 4;//类似于a[0]=4
// pArr[1] = 10;//类似于a[1]=10;
// printf("%d %d\n",*pArr,pArr[1]);
//我们可以把pArr当做一个普通数组来使用
for(int i=0;i<len;++i){
scanf("%d",&pArr[i]);
}
for(int i=0;i<len;++i){
printf("%d\n",*(pArr+i));
}
free(pArr);//把pArr所代表的动态分配的20个字节的内存释放
return 0;
}
数据结构
二、数据结构
数据结构 = 个体的存储 + 个体的关系存储
算法 = 对存储数据的操作
模块一:线性结构【把所有的结点用一根直线穿起来】
连续存储【数组】
离散存储【链表】
①定义:n个结点离散分配,彼此通过指针相连,每个节点只有一个前驱节点和后续节点,首节点没有前驱节点,尾结点没有后续节点
②专业术语:
首节点:第一个有效节点
尾结点:最后一个有效节点
头结点:第一个有效节点之前的那个节点,头节点并不存放有效数据,加头结点的目的主要是为了方便对链表的操作
头指针:指向头结点的指针变量
尾指针:指向尾结点的指针变量
③确定一个链表需要几个参数:
只需要一个参数----头指针 因为我们通过头指针可以推算出链表的其他所有参数
④分类:
单链表、双链表、循环链表、非循环链表