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 }
View Code
 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 }
View Code

****************************************函数******************************************
函数:
  有三要素:
    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 }
View Code

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 }
View Code

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
View Code

***************************************结构体*****************************************
结构体:
    自定义数据类型,属于构造类型

    结构体的定义:
      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 }
View Code

 

******************************结构体指针
结构体指针:
      结构体指针访问结构体内成员用: -> 访问

 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 }
View Code

 

************************************标准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 }
View Code

 

posted @ 2020-04-05 20:39  Halo辉Go  阅读(180)  评论(0编辑  收藏  举报