提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
总务部软件培训
一、指针
&取地址运算符
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
- 项目2
- 项目3
- 计划任务
- 完成任务
横线
字体颜色
<font color= >
我是红色的文本
我是绿色的文本