2020年科协总务部第一次软件培训

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

总务部软件培训


一、指针

&取地址运算符

	int a = 3;
	printf("%d", &a);
	int b = 3;
	printf("%d", &b);

指针的定义

1指针变量是一种保存内存地址的特殊变量。

指针的值是一个地址,这个地址可以是一个内存变量的地址,也可以是一块内存单元的首地址。
如果指针变量p的值是a,就说指针变量p指向地址为a的内存单元

2指针变量定义的一般形式为:

	int* p1;//p1是指向整型数据的指针变量
	float* p2;//p2是指向浮点型数据的指针变量
	char* p3; //p3是指向字符型数据的指针变量

3.指针初始化

	int x;
	x = 66;
	int* p;
	p = &x;
	printf("%d\n", x);
	printf("%d\n", &x);
	printf("%d\n", p);
	printf("%d\n", &p);

*取内容运算符

*是用来获取指针变量所指向的内存单元的值

	int x;
	x = 66;
	int* p;
	p = &x;
	printf("%d\n", *p);

例题

	int a = 100;
	int b = 200;
	int* p1, * p2;
	p1 = &a;
	p2 = &b;
	printf("%d %d %d %d\n", a, b, *p1, *p2);
	int t;
	t = *p1;
	*p1 = *p2;
	*p2 = t;
	printf("%d %d %d %d\n", a, b, *p1, *p2);
	*p2 = 500;
	printf("%d %d %d %d\n", a, b, *p1, *p2);

指针的加减运算

	int* p;
	p = (int*)2000;	//int类型所占的内存字节数4
	p = p + 3;		//p=2000+3*4
	printf("%d\n", p);
	double* q;
	q = (double*)1000;//double类型所占的内存字节数8
	q = q - 1;		//q=1000-1*8
	printf("%d\n", q);

二、指针和数组的关系

1.指针和一维数组的关系

一维数组的数组名是一个指针,指向数组的首地址
假设下面的程序段:

	int a[] = { 2,5,8,3,1 };
	int* p;
	p = a;
	printf("%d %d\n", a, p);

这时p与a指向同一个地址a[0]
等价于:

	int a[] = { 2,5,8,3,1 };
	int* p;
	p = &a[0];
	printf("%d %d\n",&a[0], p);

引用一维数组的两种方法

1:下标法2: 指针法
a[i]形式访问数组元素假设p=a。 可以采用*(a+i)和*(p+i)的形式访问下标的数组元素。即*(a+i)或*(p+i)与a[i]是等价的。p+i 和a+i都表示的是a[i]的地址,或者说指向数组a的第i个元素;*(a+i) 和 *(p+i)的值就是a[i]。

例如:

int a[] = { 1,2,3,4,5 };
	int* p;
	p = a;
	for (int i = 0; i < 5; i++) {
		printf("%d ", a[i]);
	}
	printf("\n");
	for (int i = 0; i < 5; i++) {
		printf("%d ", *(a+i));
	}
	printf("\n");
	for (int i = 0; i < 5; i++) {
		printf("%d ", *(p+i));
	}
int a[] = { 1,2,3,4,5 };
	int* p;
	p = a;
	for (int i = 0; i < 5; i++) {
		printf("%d ", &a[i]);
	}
	printf("\n");
	for (int i = 0; i < 5; i++) {
		printf("%d ", a+i);
	}
	printf("\n");
	for (int i = 0; i < 5; i++) {
		printf("%d ", p+i);
	}

指针与多维数组

二维数组可以当作一维数组使用

a[3][4]的二位数组可以看作a[12]的一维数组

	int a[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };
	int* p;
	p = &a[0][0];
	for (int i = 0; i < 12; i++) {
		printf("%d ", *(p+i));
	}

多级指针

指针变量中存放一级指针变量的地址

指针的间接访问

一级指针p1的间接访问:表示对p1所指向的目标内存单元的存取。
代码如下(示例):

	int i, * p;
	p = &i;
	*p = 100;

二级指针p2的间接访问:它指向一级指针p1,p1指向变量i
因此*p2是对p1所在内存单元的访问, **p2是最最终目标变量内存单元的访问。
代码如下(示例):

	int i, * p1, ** p2;
	p1 = &i;
	*p1 = 100;
	printf("%d\n", i);
	p2 = &p1;
	**p2 = 200;
	printf("%d\n", i);

指针数组

指针数组的元素是指针变量

代码如下(示例):

	int b[2][3] = { {1,2,3},{4,5,6} };
	int* pb[2];
	pb[0] = b[0];
	pb[1] = b[1];
	for (int i = 0; i < 2; i++) {
		for (int j = 0; j < 3; j++, pb[i]++) {
			printf("%4d", *pb[i]);
		}
	}

使用指针的好处

①.指针的使用使得不同区域的代码可以轻易的共享内存数据,这样可以使程序更为快速高效;
②.在数据传递时,如果数据块较大,可以使用指针传递地址而不是实际数据,即提高传输速度,又节省大量内存;

指针形参

函数的形参如果不是引用类型,那么就会将实参的值拷贝后赋值给形参,即函数获得的是参数值的一份拷贝;在数据量很大时复制和传输实参的副本可能浪费较多的空间和时间,此时可以使用传指针调用。
指针参数不会复制要处理数据的副本,使得被调函数能够访问和修改主调函数中对象的值。
在这里插入图片描述

三 动态储存分配

动态储存分配的定义

如下编译错误,c语言不允许动态定义数组大小

	int n;
	scanf("%d", &n);
	int a[n];

动态分配内存是指在程序运行过程中,根据实际数据量的大小来分配一块大小合适的连续的内存单元。

malloc函数

首先定义一个指针,然后将malloc函数返回的值给所定义的指针。
如果内存分配成功,返回值是一个空类型的指针,表示内存分配块的首地址。
如果内存分配失败,则返回值是NULL
函数原型:
void *malloc(unsigned int size);

Free函数

当动态内存不再使用的时候,free函数可以释放动态内存,malloc函数和free函数需要成对使用。
void free(void *p)
p是malloc函数分配成功时返回的指针

动态内存分配实现可变长的一维数组

 #include<stdlib.h>
	double* p;
	//p可以看作有m个元素的数组
	p = (double*)malloc(m * sizeof(double));
	.....
	free(p);
例题: 从键盘输入数据的个数n,然后随机输入n个数,对n个数排序输出。
	int n;
	printf("输入数据个数n:");
	scanf("%d", &n);
	int* p;
	p = (int*)malloc(n * (sizeof(int)));
	if (p == NULL) {
		printf("内存不足");
		exit(0);
	}
	printf("\n输入%d个数据", n);
	for (int i = 0; i < n; i++) {
		scanf("%d", &p[i]);
	}
	//排序前数组
	for (int i = 0; i < n; i++) {
		printf("%5d", p[i]);
	}
	.....
	free(p);

动态内存分配实现可变长的二维数组

从键盘输入数据m,n,然后生成一个m行n列的二维数组,然后键盘输入数组的值,最后打印

	int m, n;
	double** p;
	scanf_s("%d%d", &m, &n);
	p = (double**)malloc(m * sizeof(double*));
	for (int i=0; i < 3; i++) {
		p[i] = (double*)malloc(n * sizeof(double));
	}
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			scanf_s("%.4lf", &p[i][j]);
		}
	}
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			printf("%.4lf", p[i][j]);
		}
	}
	free(p);

四 结构体

在前面已经介绍了整型(int,long,….),浮点型(flaot,double),字符型(char),还介绍了数组(存储一组具有相同类型的数据),字符串。
但是在实际问题中只有这些数据类型是不够的,有时候我们需要其中的几种一起来修饰某个变量。例如:一个学生的信息就需要学号(字符串),姓名(字符串),年龄(整形)等等,这些数据类型都不同但是他们又是表示一个整体,要存在联系,那么我们就需要一个新的数据类型。——结构体,他就将不同类型的数据存放在一起,作为一个整体进行处理。

30名同学的成绩

struct student {
	int id;			//学号
	char name[20];	//姓名
	char sex;		//性别
	int age;		//年龄
	float score;	//成绩
};

struct 是结构体的关键词
student是结构体类型名
{}里的是结构体的成员变量

定义结构体类型名 变量名

  • 直接赋值
#include <stdio.h>
#include <string.h> 
struct student {
	int id;			//学号
	char name[20];	//姓名
	char sex;		//性别
	int age;		//年龄
	float score;	//成绩
};
void main()
{
	student s1 = { 1962810202,"孙梦霞",'X',19,60 };
	student s2 = { 1962810203,"孙梦露",'X',19,80 };
	printf("%d\n%s\n%c\n%d\n%lf\n", s1.id, s1.name, s1.sex, s1.age, s1.score);
	printf("%d\n%s\n%c\n%d\n%lf\n", s2.id, s2.name, s2.sex, s2.age, s2.score);
}
  • 单个赋值
#include <stdio.h>
#include <string.h> 
struct student {
	int id;			//学号
	char name[20];	//姓名
	char sex;		//性别
	int age;		//年龄
	float score;	//成绩
};
void main()
{
	student s3;
	s3.id = 1962810204;
	s3.age = 19;
	strcpy_s(s3.name, "孙梦雪");
	s3.sex = 'X';
	s3.score = 90;
	printf("%d\n%s\n%c\n%d\n%lf\n", s3.id, s3.name, s3.sex, s3.age, s3.score);
}
  • 结构体数组
#include <stdio.h>
#include <string.h> 
struct student {
	int id;			//学号
	char name[20];	//姓名
	char sex;		//性别
	int age;		//年龄
	float score;	//成绩
};
void main()
{
	student s[2] = { {1962810202,"孙梦霞",'X',19,60 },{1962810203,"孙梦露",'X',19,80} };
	student ss[2] = { 1962810204,"孙梦雪",'X',19,90 ,1962810204,"孙梦雨",'X',19,100 };
	for (int i = 0; i < 2; i++) {
		printf("%d %s %c %d %lf\n", s[i].id, s[i].name, s[i].sex, s[i].age, s[i].score);
	}
	for (int i = 0; i < 2; i++) {
		printf("%d %s %c %d %lf\n", ss[i].id, ss[i].name, ss[i].sex, ss[i].age, ss[i].score);
	}
}

五 使用csdn的markdown编译器

markdown简介

Markdown是一种轻量级标记语言,它允许人们使用易读易写的纯文本格
式编写文档,然后转换成有效的XHTML(或者HTML)文档。目前许多网
站都广泛使用Markdown来撰写帮助文档或是用于论坛上发表消息。 如
GitHub、Reddit、Diaspora、Stack Exchange、OpenStreetMap 、
SourceForge、简书等,甚至还能被使用来撰写电子书。

markdown语法

Markdown是一种简单的格式化文本的方法,在任何设备上看起来都很棒。它不会做任何花
哨的事情,比如改变字体大小、颜色或类型——只是基本的,使用你已经知道的键盘符号。

制作表格

在这里插入图片描述
样式:

姓名成绩专业
孙梦霞60计算机
黄老师80自动化
张老师100物联网
代码片
#include <stdio.h>
#include <string.h> 
struct student {
	int id;			//学号
	char name[20];	//姓名
	char sex;		//性别
	int age;		//年龄
	float score;	//成绩
};

在这里插入图片描述

// An highlighted block
var foo = 'bar';
文本样式

在这里插入图片描述

强调文本
强调文本

加粗文本
加粗文本
标记文本
删除文本

引用文本
在这里插入图片描述

H2O is是液体。
CO2

210 运算结果是 1024。
33

项目

在这里插入图片描述

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  4. 计划任务
  5. 完成任务
横线

在这里插入图片描述



字体颜色

在这里插入图片描述

<font color= >
我是红色的文本
我是绿色的文本

总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值