Linux下的C语言基础-3
对数组排序,使用指针但不使用第三方变量
1 #include <stdio.h> 2 3 int main(int argc, const char *argv[]) 4 { 5 int a[10]={1,5,7,99,22,44,66,77,88,10}; 6 7 int *p,*q,i,j; 8 9 p=q=a; 10 11 for(i=0;i<10;i++){ 12 13 for(j=0;j<10;j++){ 14 15 16 if(*p<*q){ 17 18 (*p)^=(*q); 19 (*q)^=(*p); 20 (*p)^=(*q); 21 22 } 23 q++; 24 } 25 p++; 26 q=a; 27 28 } 29 p=a; 30 for(i=0;i<=9;i++){ 31 32 printf("%d ",*p); 33 p++; 34 35 } 36 putchar(10); 37 return 0; 38 }
指针
指针是一个变量,表示普通变量的地址,指针的内存字节宽度视操作系统而定。
32位4字节
64位8字节
int a;
int *p = &a;
*p==a
p==&a
&为普通变量取地址符,
* 为指针变量存储的地址数据所存储的值
指针的定义:
类型说明 * 变量名
int *p;只能指向int类型的普通变量地址
char *s;只能指向char类型的普通变量地址
指针赋值:
指针使用前不仅要定义说明,而且要赋予具体的值
未经赋值的指针不能随便使用;
int i;
int *p;
p = &i;
********
int i,*p;
p=&i;
********
int i ,*p=&i;
指针常量:
指向一块区域,这块区域可读可写,但是指针初始化后不能改变
char *const p;
常量指针:
指向一块区域,这块区域只可读不可写。
const char *p;
野指针:
int *a;
*a = 52;
a是随机指向一个内存单元,这样的指针称为野指针。使用是不合法的
指针在间接使用之前一定要确保已经指向一个合法的对象
#include <stdio.h>
int main(int argc, const char *argv[])
{
int *a;
*a = 52;
return 0;
}//错误的操作
指针算数运算:
+
-
++
--
p-q
关系运算:
>
<
>=
<=
==
!=
没有乘除的算数运算,和逻辑运算
1 #include <stdio.h> 2 3 int main(int argc, const char *argv[]) 4 { 5 /* int *p=NULL; 6 char *s = NULL; 7 8 printf("int *p len=%ld\n char *s len=%ld\n",sizeof(p),sizeof(s)); 9 */ 10 11 int a = 10; 12 int *p = &a; 13 14 if(*p==a) 15 printf("*p=%d==a=%d\n",*p,a); 16 17 if(p==&a) 18 printf("p=%p==&a=%p\n",p,&a); 19 20 21 return 0; 22 }
1 #include <stdio.h> 2 3 const int *p; 4 5 int main(int argc, const char *argv[]) 6 { 7 int a = 10; 8 9 int b = 20; 10 11 p = &a; 12 13 printf("*p=%d\n",*p); 14 15 scanf("%d",p); 16 printf("*p=%d\n",*p); 17 18 p=&b; 19 printf("*p=%d\n",*p); 20 21 scanf("%d",p); 22 printf("*p=%d\n",*p); 23 return 0; 24 }
****************************************函数******************************************
函数:
有三要素:
1:功能--->这个函数干什么的
2:参数--->参数的数据类型及意义
3:返回值--->返回的数据类型及意义
函数是完成特定功能的代码块,有参数,也可以没有。有返回值,也可以没有。
函数定义:是对函数功能的确立(实现)
<数据类型><函数名>(<形式参数>)
{
功能实现语句;
return {(<表达式>)};
}
数据类型:基本数据类型
函数名:不能与32个关键字重复、不能用数字 做到见名知意
形式参数:就是形参列表,简称形参。可以是任意类型
调用时,将赋予形式参数实际的值
形参只有在被调用时才分配内存空间,调用完毕后立即释放,且只在函数内有效
{ }: 花括号中的内容称为函数体,
return:return的值要与函数数据类型一致
函数声明:
就是把函数名、返回值类型、形参类型和个数、顺序 告诉编译器
vim分屏操作
:vsp 文件名 左右分屏
:sp 上下分屏
关闭分屏 按esc :wq 保存退出 一次退一个
int main(int argc,const char *argv[])
int :返回值类型
main:程序入口
argc:输入参数的个数
argv:输入参数的数组
main.c文件
1 #include <stdio.h> 2 #include "func.h" 3 #include "func.c" 4 5 int main(int argc, const char *argv[]) 6 { 7 int a,b; 8 printf("请输入两个数\n"); 9 10 scanf("%d%d",&a,&b); 11 12 int ret = add(a,b);//函数的调用 13 printf("a+b=%d\n",ret); 14 15 sub(a,b); 16 17 return 0; 18 }
func.h文件
1 #include <stdio.h> 2 #include "func.h" 3 4 //func.c是函数实现 5 6 int add(int a,int b) 7 { 8 return a+b; 9 } 10 11 void sub(int a,int b) 12 { 13 if(a<b) 14 printf("b-a=%d\n",b-a); 15 16 if(a>b) 17 printf("a-b=%d\n",a-b); 18 19 if(a==b) 20 printf("a==b\n"); 21 }
func.h文件
1 #ifndef __FUNC_H 2 #define __FUNC_H 3 4 //.h文件声明函数 5 6 #include <stdio.h> 7 8 int add(int a,int b); 9 10 void sub(int a,int b); 11 12 13 14 15 #endif
***************************************结构体*****************************************
结构体:
自定义数据类型,属于构造类型
结构体的定义:
struct 结构体名
{
数据类型 成员;
.
.
.
};--->记得加分号
定义结构体不能对成员进行初始化
struct 结构体名
{
数据类型 成员;
}结构体变量名 = {初始化数据表};
结构体变量的声明:
struct 结构体名 结构体变量名
结构体变量的使用
结构体变量访问结构体内成员用 . 访问
示例:
1 #include <stdio.h> 2 3 struct studen{ 4 5 int class; 6 char *name; 7 int age; 8 char *sex; 9 int gra; 10 }; 11 12 int main(int argc, const char *argv[]) 13 { 14 struct studen XM; 15 16 XM.class = 2016; 17 XM.name = "xiaoming"; 18 XM.age = 20; 19 XM.sex = "man"; 20 XM.gra = 135; 21 22 printf("班级:%d\n姓名:%s\n年龄:%d\n性别:%s\n成绩:%d\n",XM.class,XM.name,XM.age,XM.sex,XM.gra); 23 24 printf("%ld\n",sizeof(XM)); 25 26 return 0; 27 }
******************************结构体指针
结构体指针:
结构体指针访问结构体内成员用: -> 访问
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 struct student 5 { 6 int class; 7 char *name; 8 int age; 9 char *sex; 10 int gra; 11 12 };//结构体的定义 13 14 int main(int argc, const char *argv[]) 15 { 16 struct student stu;//结构体变量定义 17 struct student *stu_p=&stu; 18 19 //stu_p = (struct student *)malloc(sizeof(stu));如果单纯的定义结构体指针变量需要为 20 结构体指针分配内存空间; 21 用malloc()函数在堆空间分配, 22 23 stu_p->class = 2016; 24 stu_p->name = "小明"; 25 stu_p->age = 22; 26 stu_p->sex = "男"; 27 stu_p->gra = 135; 28 29 printf("班级:%d\n姓名:%s\n年龄:%d\n性别:%s\n成绩:%d\n",stu_p->class,stu_p->name,\ 30 stu_p->age,stu_p->sex,stu_p->gra); 31 32 33 return 0; 34 }
************************************标准IO******************************************
文件操作:liunx下一切皆文件
标准IO:
在stdio.h文件 定义的 FILE ---->48 行 typedef struct _IO_FILE FILE;
FLIE是一个结构体,每个被使用的文件都在内存中开辟一个区域,用来存放文件的有关信息
这些信息是保存在FILE结构体变量中。该结构体类型是由系统定义的,取名为 FILE
1 FILE *fopen(const char *path, const char *mode); 2 打开文件fopen 3 1.fopen 4 #include <stdio.h> man 3 fopen 5 FILE *fopen(const char *path, const char *mode); 6 /**************************************************************** 7 * 功能:打开一个文件,返回FILE*类型的流指针 8 * 参数:@path 指定文件路径 相对路径/绝对路径 9 * @mode 指定文件打开的模式 10 * r: 以读的方式打开一个文件,同时流指针指向文件开头 11 * r+: 以读写的方式打开一个文件,同时流指针指向文件开头 12 * w: 以写的方式打开一个文件,如果文件存在清空,如果不存在创建文件, 13 * 同时流指针指向文件开头 14 * w+: 以读写的方式打开一个文件,如果文件存在清空,如果不存在创建文件, 15 * 同时流指针指向文件开头 16 * a: 以写的方式打开一个文件,如果不存在创建文件,如果文件存在以追加方式写, 17 * 同时流指针指向文件结尾 18 * a+: 以读写的方式打开一个文件,如果不存在创建文件,如果文件存在读流指针在 19 * 文件开头,写流指针在文件结尾(追加方式写) 20 * 21 * 返回值: FILE * 22 * 成功返回 FILE *(FILE pointer) 23 * 失败返回 NULL, 并且设置错误码 errno 24 *****************************************************************/ 25 26 27 关闭文件fclose 28 fclose 29 #include <stdio.h> 30 int fclose(FILE *stream); 31 /********************************** 32 *功能:关闭一个流指针 33 *参数:@stream 文件流指针 34 *返回值: 成功 0 35 * 失败 EOF 更新 errno 36 ***********************************/ 37 38 读文件fgets 39 fgets 40 #include <stdio.h> 41 char *fgets(char *s, int size, FILE *stream); 42 /************************************** 43 *功能:从指定流中获取一个字符串 44 *参数:@s: 把从文件流中获取的一个字符串存储到s中 45 * @size: 要从文件中读 size - 1 个字符 46 * 如果一行不够 size - 1 个字符了, 47 * 就不会再读下一行了 48 * @stream: 文件流指针 49 *返回值: 成功 返回 s 50 * 失败 返回 NULL 51 ****************************************/ 52 53 写文件fputs 54 fputs 55 #include <stdio.h> 56 int fputs(const char *s, FILE *stream); 57 /************************************** 58 *功能:输出一个字符串到指定文件流中 59 *参数:@s: 将要输出到流文件中的字符串首地址 60 * @stream: 输出到指定文件流 61 *返回值: 成功 返回非负数 62 * 失败 返回 EOF -1 更新 errno 63 ****************************************/
示例:
1 #include <stdio.h> 2 3 int main(int argc, const char *argv[]) 4 { 5 FILE *fp = NULL; 6 FILE *fp2 = NULL; 7 8 char f_buf[128]={0}; 9 10 fp = fopen("./file.txt","r");//在当前路径下以只读方式打开一个名为file.txt的文件 11 if(fp==NULL) 12 { 13 perror("fopen\n"); 14 return 1; 15 } 16 17 char *s = fgets(f_buf,sizeof(f_buf),fp);//将文件数据写入到我们定义好的缓冲区f_buf 18 if(s==NULL){ 19 20 perror("fgets\n"); 21 return 1; 22 23 } 24 25 fp2 = fopen("./file2.txt","w");//以只写方式打开另一个文件file2.txt 26 if(fp2==NULL){ 27 28 perror("fopen\n"); 29 return 1; 30 31 } 32 33 int ret=fputs(f_buf,fp2);//将从file.txt文件中获取的数据写入到file2.txt中去 34 if(ret<0){ 35 36 perror("fputs\n"); 37 return 1; 38 39 } 40 41 fclose(fp2);//关闭文件 42 43 ret = fclose(fp);//关闭文件 44 45 printf("%d\n",ret); 46 47 printf("f_buf get data is:%s\n",f_buf); 48 49 return 0; 50 }