发布时间:2025-12-09 16:14:16 浏览次数:5
计算机硬件只能够识别电平信号,正电平或负电平,计算机的的各种按钮触发各种电平与计算机交互。随着随着操作系统的发展,人们用1,0分别表示正电平和负电平,并由0,1所组成的一系列指令指挥计算机工作。
一种由二进制所组成的指令集合称为机器语言。机器语言依赖于硬件,因此也称为低级语言,机器语言全由二进制指令组成难学,难计,难写。
20世纪50年代左右出现了高级语言,高级语言依赖于操作系统,使用字符作为计算机指令,而字符正是自然语言的一部分,更贴合人类的使用习惯。高级语言依赖于操作系统,由操作系统将其转化为字节,在转化为二进制,最后转为硬件指令。
C语言是最流行的系统语言,诞生于贝尔实验室,随着C语言的发展,其移植到各种计算机上,已成为世界上应用最广泛的语言。
后来的许多语言都受到c的影响,大多都是用c来开发,如Java,Python等。高级语言学习更方便也更快捷。
多行注释是/*...*/。
c语言的代码会编译成二进制文件,操作系统据可以使用这里二进制指令文件来控制计算机。
在数据存储时,对于计算机来说二进制是可执行的指令集合,计算机的存储器是用半导体集成电路构成的,包含众多脉冲电路,二极管元件,每个二极管元件相当于开关。所以每次都会用两种状态,对电平来说就是正电平和负电平,用1,0表示。如下图
指针的定义*
指针通过*定义,具体表达式为类型 * 指针变量;指针指向的是变量的地址,因此需要将变量的地址赋给指针变量。
int *p;int a= 10;p = &a;printf("%d",p);定义指针变量需要注意的是*表示该变量是一个指针变量,区别于其他基变量类型;定义指针时必须指定基类型,原因时不同类型的变量的地址所占的内存空间不一样;赋值给指针变量的是地址而不是数据即用&取地址,指针变量只能取地址。
定义指针变量时*表声明类型为指针变量,如 int * p;指针变量是p而不是*p。p = &a;
指针变量的引用
定义指针变量的关键字是*,除了在定义是起声明作用外,*在也可以引用指针变量作取值和赋值使用。
*在定义指针变量时起声明作用,在引用指针变量时起取指针变量指向内存地址的数据的作用。
&为取地址符号&a表示取a变量的地址;*为指针运算符,*p为指针变量p指向的对象的值。
#include<stdio.h>int main(){int a = 10;int *p;p=&a;printf("变量的值%d\n",*p);printf("指针初始地址%d\n",p);*p = 100;printf("修改后的值%d\n",*p);printf("赋值后指针地址%d\n",p);}指针变量做函数参数
指针变量做函数参数是时是将变量的地址传输到另一个函数中,但是不能通过形参的指针指向改变实参的指针指向,只是错误的。
#include<stdio.h>int main(){int a = 10;int *p;p=&a;printf("变量的值%d\n",*p);printf("指针初始地址%d\n",p);*p = 100;printf("修改后的值%d\n",*p);printf("赋值后指针地址%d\n",p);int a1 = 10;int a2 = 100;printf("交换前%d,%d\n",a1,a2);swap(&a1,&a2);printf("swap交换%d,%d\n",a1,a2); swap1(&a1,&a2);printf("swap1交换%d,%d\n",a1,a2); }int swap(int *p1,int *p2){int tmp;tmp = *p1;*p1 = *p2;*p2 = tmp;} int swap1(int *p1,int *p2){int *tmp;tmp = p1;p1 = p2;p2 = tmp;}
在上述程序中,swap函数传递两个变量的地址,在函数体中通过*取出指针变量指向的值来交换数据,这个原理和下面的原理时一致的:
但是swap2,企图修改指针指向的地址即通过交换两个指针变量的地址来间接改变变量的值,这是错误的,因为不能通过形参来改变实参的值。(c语言形参的传递都是值传递,对实参复制一份相同的数据分配空间)
指针引用数组
一个数组包含若干元素,在C语言中数组的地址即数组首个元素的地址,c语言底层实现了数组的查找,取值的操作,因此只需要记录数组的首地址即可,编辑器就可以通过特定算法计算其后元素的地址。
int array[] = {1,2,3,4,5};printf("数组array的地址为%d\n",array);printf("数组array[1]的地址为%d\n",&array[0]);系统知道数组首地址后可以自动计算其余元素的地址,因此指针变量在操作数组时也只需要记录数组的首地址即可。
C语言中数组的指针就是数值首地址。
int *p = &array[0];printf("%d\n",p);由于p指针变量表示&array[0]即*p = array[0],p = &array[0],于是得出结论,指针变量是数组首元素的地址,在数组中每个元素同时同一类型,因此占据的内存空间一致,那么p+1就是array[1]的地址,一次类推。
当使用指针表示数组是,指针变量表示数组的首地址,指针变量的累加表示地址块的累加,依次表示数组其他元素的地址。
指针运算
上述操作中,涉及到指针运算,指针运算并不是逻辑上的将地址的值加一,而是将数组元素所占的地址加一个字节,如一个int占4字节,指针加一指针所占内存空间就加4个字节。
指针表示字符数组
用字符数组存放一个字符串,然后用数组下标可以访问数组元素,也可以通过%s直接输出真个字符数组。
也可以同指针指向一个字符串,相对于字符数组更简单,通过指针指向字符串,又编译系统自动分配内存大小。
指针表示字符串时也是将字符串当作字符数组初始,由底层实现,只能初始化赋值。
//定义格式char *str = "xiaoxu";//错误定义char *str;str = "xiaoxu";char *str;*str = "xiaoxu";下面两个定义都是错误的,字符串底层是用字符数组,指针只能表示一个字符变量的地址,因此下面两个定义都是错误的。底层实现的方式比一样,只能初始化定义。
指向函数的指针
指针也可以指向函数,称为函数指针。
指针在指向函数时需要声明数据类型 (*指针变量名) (参数列表),然后再将指针变量指向函数名。就可以实现指针对函数的引用了。
//定义函数int max(int a,int b){return a+b;}//指针声明int (*p) (int,int);p = max;//指针引用函数int c;c= (*p)(2,1);printf("%d",c);指针数组
如果数组的元素全是指针类型变量,则称为指针数组,指针数组的每一个元素都存放一个地址,相当于指针变量。
如果变量为数组指针,那么对元素的引用就是多重指针**p。
结构体
c语言中提供的基类型有时后并不能满足需求,于是提供了用户自定义的数据类型结构体。
结构体定义:
struct student{数据类型 变量;...};结构体由strcut关键字定义,其后紧跟结构体的自定义名称,成员变量为类型和变量名,基于基本类型。成员变量也可以是结构体变量。
结构体定义时也可以同时实例化,在定义结束的分号后追加变量名用,隔开即可。
//结构体定义struct Student{char name[20];char sex;int age;};//结构体初始化定义struct Student{char name[20];char sex;int age;} Stu,Stu1;struct Student{char name[20];char sex;int age;} Stu={"xiaoxu",'m',21};对结构体变量的引用方式为结构体变量.成员名。通过.可以获取结构体变量的各个成员的值,如果成员变量也是结构体,就需要一级一级查找。
结构体类型也可以通过声明的方式定义但是要加上struct关键字,除了声明式定义外,也可以初始化定义,就像上面代码一样。
#include<stdio.h>//初始化结构体变量定义struct Student{char name[20];char sex;int age;} Stu={"xiaoxu",'m',21};int main(){printf("%s",Stu);///声明式结构体变量定义struct Student stu2 = {"zhansan",'m',21} ;printf("%s",stu2.name);}结构体数组
结构体变量也可以作为数组的元素,数组元素全是结构体变量的数组称为结构体数组。
结构体数组的定义步骤:
//1、定义结构体struct Goods{char name[20];float size;};//2、声明并初始化结构体数组(也可以先声明后初始化)struct Goods god1[5] ={{"mianbao",0.12}};结构体指针
结构体指针就是将指针变量指向结构体的地址。
//定义结构体struct Student{char name[20];char sex;int age;};//声明初始化结构体struct Student stu3={"lisi",'m',21}; //定义结构体指针变量struct Student *p;p = &stu3;printf("%s\n",(*p).name);c中.的优先级要高于*因此*p需要用括号括起来。
在结构体指针中,为了简化(*指针变量).结构体成员的书写,c语言提供了->符号表示取值符号用来代替*和.简化编写。
(*p).name=p->name
所以指向结构体的指针变量也可以用通过->指向结构体成员,也可以指向结构体数组的元素。
结构体变量和结构体指针做参数
将结构体变量作为参数时,可以传递成员变量个数个数据,传递的过程为值传递,将结构体变量的内存空间的所有内容全部传递给形参。也可以使用结构体指针作为参数传递。
//结构体做参数toString(struct Student stu){printf("Student{name=%s,sex=%c,age=%.2f}",stu.name,stu.sex,stu.age);}//结构体初始化 struct Student{char name[20];char sex;int age;} Stu={"xiaoxu",'m',21},stu100;//声明结构体struct Student stu3={"lisi",'m',21}; //调用方法传递结构体变量toString(stu3); //定义结构体指针//声明结构体struct Student stu3={"lisi",'m',21}; //结构体指针做参数pointerString(struct Student *stu){printf("Student{name=%s,sex=%c,age=%d}\n",stu->name,stu->sex,stu->age);}//定义指针变量struct Student *p;p = &stu3;printf("%s\n",(*p).name);pointerString(p);枚举
当变量的种类确定,只有若干几个可能的值时,可以定义为,枚举,枚举就是将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。
枚举类型用enum关键字enum week(sum,mon,tue,wed,thu,fri,sat);内部的元素被称为枚举变量或枚举常量。
#include<stdio.h>int main(){enum week{sum,mon,tue,wed,thu,fri,sat};enum week day = mon;switch(day){case sum:printf("sum");break;case mon:printf("mon");break;case tue:printf("tue");break;case wed:printf("wed");break;case thu:printf("thu");break;case fri:printf("fri");break;case sat:printf("sat");break;default : printf("null");}}文件名C:\Users\xwh\Desktop\master\test.txt
文件类型ASCII和二进制文件,ascii码用于存储字符型数据,文件后缀为txt。
文件指针
每个被使用的文件都在内存中开辟了文件信息区,用于存放文件相关信息,文件有关的类型和方法都在stdio.h的头文件中。
文件名类型为FILE类型,对文件读写需要先打开文件,读写完毕要关闭文件。打开关闭文件的方法是fopen(文件名,使用文件的方式);fclose(文件指针)表示关闭文件。
| r | ASCII文件只读 |
| w | ASCII文件只写 |
| a | ASCII文件追加 |
| rb | 二进制文件只读 |
| wb | 二进制文件只写 |
| ab | 二进制文件追加 |
| r+ | ascii码文件读写 |
"r","w","a是最基本的三种方式,在其后面加”b"表示对二进制文件,不加为ASCII文件即txt文件。"+"表示即可读又可写。
一般不对FILE类型的变量命名,而是通过FILE指针来操作文件。
文件读写
对文件读写的函数如下:
| fgetc(文件指针) | 从该文件读取一个字符 |
| fputc(文件指针) | 写一个字符到文件 |
| fgets(str,n,fp) | 从文件fp中读取一个长度为(n-1)的字符串,存到字符数组str中 |
| fputs(ch,fp) | 把字符写道文件fp中 |
| fprintf(文件指针,格式化字符,输出列表) | 格式化输出(字符) |
| fscanf(文件指针,格式化字符串,输出列表) | 格式化写入(字符) |
| fread(buffer,size,count,fp) | buffer是二进制地址,size是二进制字节数,count是要写多少个字节,fp文件指针 |
| fwrite(buffer,size,count,fp) | 同上 |
读写文件时可以在文件的任何位置写入数据,也可以在任何读取数据。c提供了fseek函数标记文件的位置,就可光标一样的功能。
fseek(文件指针,位移量,起始点)
文件是外部介质上数据的集合,操作系统把所有输入输出数据作为文件来管理。每个文件都必须要又文件路径,文件主干和后缀。c语言中常用文件指针来操作文件。