2020-11-28 第二周周报
——————————————————————————————
小菜鸡这次又要分享本周所学…,本周所学的重点还是放在C语言上面。
- 全局变量与局部变量
全局变量:在所有函数外面定义的变量。范围是从定义开始到程序的结果。
局部变量:函数内部定义的形参或着变量。只能在本函数内使用。
但是要注意的是在一个程序中如果定义的局部变量的名字与全局变量的名字一样局部变量会把全局变量屏蔽。如下程序会输出’8’。
#include <stdio.h>
int i=99;
void f(int)
{
printf("%d",i);
}
int main()
{
f(8);
return 0;
}
- 指针
指针:本质是地址,即每个内存单元的编号。
指针的优点:能表示一些数据结构、快速传递数据、使函数返回一个以上的值、能直接访问硬件、能够方便的处理字符串。
个人的理解全在下面的程序里面了。
#include <stdio.h>
int main()
{
int * p;//p是变量名字,int * 表示变量p存放的是int类型的变量的地址
int i=3;//
p=&i;//使p保存了i的地址,因此p指向i,但p不是i。
*p=i;//*p=i(* 指针变量)=(普通变量)。
printf("%d",*p);
return 0;
}
指针实现两个数字的交换
#include <stdio.h>
void exchange( int * p, int * q)
{
int t;
t=*p;
*p=*q;
*q=*p;
}
int main()
{
int a=3;
int b=5;
f(&a,&b);
printf("%d %d",a,b);
return 0;
}
指针输出一维数组 两个变量:数组的首地址与数组的长度。
#include <stdio.h>
void f(int * p,int len)
{
p[3]=88;
}
int main(void)
{
int a[6]={
1,2,3,4,5,6};
printf("%d\n",a[3]);
f(a,6);//首地址+长度
printf("%d\n",a[3]);
return 0;
}
小知识:指针变量一般不能进行相加减与乘除,只有在两指针变量指向同一块连续空间中的不同存储进行指针变量的相减。
所有指针变量的字节占有数是4个字节。
3.动态内存分配
- 必须使用malloc函数。
- malloc只有一个形参,并且形参是整形。
- 形参(4)意为请求系统为本程序分配4个字节
- 格式 例如 int * p=(int*)malloc(4);
动态分配之数组
#include <stdio.h>
int main()
{
int a[5];
int len;
int * p;
int i;
printf("请输入你想要的长度");
scanf("%d",&len);
p=(int *)malloc(4*len);
for(i=0;i<len;i++)
{
printf("%d\n",p[i]);
}
free(p); //释放点动态分配的数组
return 0;
}
多级指针
```c
#include <stdio.h>
int main()
{
int i=10;
int * p=&i;
int **q=&p;
int ***r=&q;
printf("%d",***r);
return 0;
}
4.结构体
为什么需要结构体?
为了表示一写复杂的事物。
什么叫结构体?
把一些基本数据类型组合在一起形成的新的复合数据类型。
#include <stdio.h>
struct student
{
int score;
char sex;
};
int main()
{
struct student st={
80,'f'};
printf("%d %c",st.score,st.sex);
return 0;
}
5.枚举
定义:将事wu
#include <stdio.h>
enum weekday
{
Monday,Turday,Wednesday,Tuesday,Friday,Saturday,Sunday
};
int main()
{
enum Weekday.day=Wednesday;
printf("%d\n",day);
return 0;
}
6.学生成绩系统
指针+结构体+冒泡排序
(动态分配内存+指针一维数组)
#include <stdio.h>
#include <malloc.h>
struct student
{
int score;
char name[100];
//char name[100];
};
int main ()
{
int i,n,j;
struct student * f;
struct student t;
printf("你要输入学生的个数\n");
scanf("%d",&n);
f=(struct student *)malloc(n*sizeof(struct student));//动态创造一维数组!!!!
for(i=0;i<n;i++)
{
printf("请输入第%d位同学的成绩:\n",i+1);
scanf("%d",&f[i].score);
scanf("%s",f[i].name);//本身就是数组名不需要加&符号
//scanf("%s",f[i].name);//本身就是数组名
}
for(i=0;i<n-1;i++)//指针数组的交换
{
for(j=0;j<n-i-1;j++)
{
if(f[j].score>f[j+1].score)
{
t=f[j];
f[j]=f[j+1];
f[j+1]=t;
}
}
}
for(i=0;i<n;i++)//结构体的输出
{
printf("score=%d\n",f[i].score);
printf("sex=%s\n",f[i].name);
//printf("name=%s\n",f[i].name);
}
return 0;
}
就分享到这了,孩子会继续加油的。