012C语言

回顾:

1.字符串数组
char *pa[5];
pa[0] -->一个字符串
可以指向 5个字符串

char a[5][10]; 保存一个字符串
用字符的二维数组保存字符串数组

          char **ppa;

2. 字符串数组的案例<带参数的main>
char *argv[] 命令行传入的参数内容
一个字符串就是一个参数
int argc 记录上面数组的元素个数


3. 程序的编译过程,--> 预处理
预处理掉 源代码中所有#开始的语句和注释

宏 #define
宏变量
宏函数
内置的宏 __DATE__
                __TIME__

条件编译
#if #else #endif

#define
#ifndef #else #endif
#ifdef #else #endif

#ifndef //防止头文件交叉引用
#define

//头文件的内容
#endif

#include
<>
"" 查找当前目,在找系统目录
----------------

构建大型程序
多人参与开发,由多个.c文件,如何将多个.c编译成为一个可执行程序?

1.将每个.c文件进行独立编译成为.o
         将.c文件关于函数原型的声明及其他公共使用到的声明 放到对应.c文件的头文件中,其他的.c 通过include 将头文件引用,即可对该.c函数的调用.

static 限制外部.c文件使用
extern 符号的具有外部链接特性

       2.将所有的.o文件 链接成一个可执行文件

make 项目编译
make 在当前目录找 makefile/Makefile 文件

创建makefile 文件,编写编译规则
一条规则
目标:该目标依赖的文件
[tab]用依赖文件生成目标文件的命令

-------------------------

    自定义数据类型   (int float)

          结构体        

          怎么构造自己的类型

vim打开多个文件 vim 文件1 文件2  -p

    struct (构造体)

/*
* 描述一个学员信息
*/

 //字符串赋值  strcpy
#include<stdio.h>
#include <string.h>
int main(){
    //1.定义student 类型
    struct student{
        char name[20];
        int  score;
        int  age;
    }stu1,stu3;  //声明了2个student 类型的 变量stu2,stu3
    stu1.score = 80;
    //stu1.name = "李辉"; //不可这么赋值  strcpy
    //strcpy("李辉",stu1.name); 不可以
    strcpy(stu1.name,"李辉");
    stu1.age = 18;
    printf("该学员的姓名=%s
",stu1.name);
    printf("该学员的成绩=%d
",stu1.score);
    printf("该学员的年龄=%d
",stu1.age);
    getchar();
    return 0;
}

 typedef  设定结构体类型的别名

#include<stdio.h>
#include <string.h>

int main(){
#if 0
    //1.定义student 类型
   struct student{
      char name[20];
      int  score;
      int  age;
   }stu2,stu3;  //声明了2个student 类型的 变量stu2,stu3
#endif
typedef struct student{  //student 可以省略
      char name[20];
      int  score;
      int  age;
   }Student;   //struct student stu1  ==>Student stu1



   //用student 类型 声明变量stu1
   // struct student stu1; 
   Student stu1; 

   //使用结构体 
   //[练习]给该学员 赋值姓名 和年龄 然后打印
   //字符串赋值  strcpy
    stu1.score = 80;
    //stu1.name = "李辉"; //不可这么赋值  strcpy
    //strcpy("李辉",stu1.name); 不可以
    strcpy(stu1.name,"李辉");
    stu1.age = 18;

    printf("该学员的姓名=%s
",stu1.name);
    printf("该学员的成绩=%d
",stu1.score);
    printf("该学员的年龄=%d
",stu1.age);
    return 0;
}
/*
 * typedef  类型的别名
 */

typedef int int32

uint32 //无符号32整型

typedef unsigned int uint32

typedef struct {

}

#include <stdio.h>
typedef int   INT;
typedef unsigned int  uint32 ;

int main(){

    INT       i =  0;
    uint32  i32 = 0;

    printf("sizeof(INT) = %d
",sizeof(INT));
    getchar();
    return 0;
}
/*
 *   结构体变量的初始化
*/
#include <stdio.h>
int main(){
    typedef struct student{  //student 可以省略
        char name[20];
        int  score;
        int  age;
    }Student;
    Student stu1 ={"李辉",0,80};
    printf("该学员的姓名=%s
",stu1.name);
    printf("该学员的成绩=%d
",stu1.score);
    printf("该学员的年龄=%d
",stu1.age);
    getchar();
    return 0;
}
结构体指针
#include <stdio.h>
int main(){
    typedef struct student{  //student 可以省略
        char name[20];
        int  score;
        int  age;
    }Student;
    Student stu1 ={"李辉",0,80};
    Student * ps = &stu1; //声明一个结构体指针变量 指向stu1
    ps->score = 90;
    printf("ps->name姓名=%s
",ps->name);
    printf("ps->score成绩=%d
",ps->score);
    printf("ps->age年龄=%d
",ps->age);
    getchar();
    return 0;
}
 /*
 *   [练习]
 *       声明一个Student 类型 (typedef)
 *       再声明 一个Student 结构体变量 s  指针变量ps   ps指向s
 *       通过ps 对 s变量进行赋值 并打印输出s的内容
 *
 *       sizeof(ps)  结果是多少?
 *       sizeof(s)   结果是多少? 为什么?
 *       name成员将20改为19后
 *       sizeof(s)   是多少?
 */
#include <stdio.h>
int main(){
    typedef struct{  //student 可以省略
        char name[19];
        char c1;
        char c2;
        int  score;
        int  age;
    }Student;   //struct student stu1  ==>Student stu1

    Student stu1;
    Student * ps = &stu1; //声明一个结构体指针变量 指向stu1


    printf("sizeof(ps) = %d
",sizeof(ps)); //4
    printf("sizeof(stu1) = %d
",sizeof(stu1)); //28

    printf("sizeof(int) = %d
",sizeof(int)); //4
    printf("sizeof(Student) = %d
",sizeof(Student)); //28
    getchar();
    return 0;
}

sizeof(ps) = 4
sizeof(stu1) = 32
sizeof(int) = 4
sizeof(Student) = 32

bit对其

 结构体变量字节数=所有成员字节数之和?
 四字节补齐 ==>4的整数倍  
/*
 *   结构体应用
 *        结构体作为函数的参数, 
 *        值传递,而不是指针,跟基本类型变量一样
 *        跟指针,数组 不一样
 *        如果要修改传入的结构体,应该传指针
 *
 *
 *        结构体作为函数的返回值
 *            跟普通基本类型一样
 *
 */
#include <stdio.h>
typedef struct student{  //student 可以省略
    char name[20];
    int  score;
    int  age;
}Student; 
void func (Student* s);

int main(){
    Student stu1 ={"李辉",30,30};
    func(&stu1);
    printf("姓名=%s
",stu1.name);
    printf("成绩=%d
",stu1.score);
    printf("年龄=%d
",stu1.age);

    getchar();
    return 0;
}
void func (Student* s)
{
    s->age = 18;

    //return 0;
}
/*
 *   结构体应用
 *        结构体作为函数的参数, 
 *        值传递,而不是指针,跟基本类型变量一样
 *        跟指针,数组 不一样
 *        如果要修改传入的结构体,应该传指针
 *
 *
 *        结构体作为函数的返回值
 *            跟普通基本类型一样
 *
 */

#include<stdio.h>
#include <string.h>

typedef struct student{  //student 可以省略
     char name[20];
    int  score;
    int  age;
}Student;   //struct student stu1  ==>Student stu1

#if 0
void func (Student s);
void func (Student s)
{
    s.age = 18;

    //return 0;
}

void func (Student* s);
void func (Student* s)
{
    s->age = 18;

    //return 0;
}
#endif
#if 0
Student  func (Student s);
Student  func (Student s)
{
    s.age = 18;
    return s;
}
#endif

Student*  func (Student s);
Student*  func (Student s)
{
    s.age = 18;
    return &s;//不可以返回局部变量的地址
}

int main(){

    //Student stu2 ={0};
    Student stu1 ={"李辉",30,30};

    //stu1 = func(stu1);
    Student *ps = func(stu1);

    printf("ps->name姓名=%s
",ps->name);
    printf("ps->score成绩=%d
",ps->score);
    printf("ps->age年龄=%d
",ps->age);

#if 0
    printf("姓名=%s
",stu1.name);
    printf("成绩=%d
",stu1.score);
    printf("年龄=%d
",stu1.age);


    printf("输入姓名:");
    //scanf("%s",stu1.name);
    scanf("%s",ps->name);

    printf("输入成绩:");
    //scanf("%d",&(stu1.score));
    scanf("%d",&(ps->score));


    printf("输入年龄:");
    scanf("%d",&(ps->age));


    printf("ps->name姓名=%s
",ps->name);
    printf("ps->score成绩=%d
",ps->score);
    printf("ps->age年龄=%d
",ps->age);
#endif

    return 0;
}

结构体的数组

#include<stdio.h>
#include <string.h>

typedef struct student{  //student 可以省略
    char name[20];
    int  score;
    int  age;
}Student;   //struct student stu1  ==>Student stu1



//void func (Student s[],int len);
void input (Student *s,int len); //跟上面是一样的
void input (Student* s,int len)
{
    for(int i = 0;i<len;i++)
    {
        printf("输入姓名:");
        scanf("%s",s[i].name);

        printf("输入成绩:");
        scanf("%d",&(s[i].score));


        printf("输入年龄:");
        scanf("%d",&(s[i].age));

    }


    //return 0;
}

void output (Student *s,int len); //跟上面是一样的
void output (Student *s,int len)
{
    for(int i = 0;i<len;i++)
    {
        printf("第%d个姓名:%s
",i+1,s[i].name);
        printf("第%d个成绩:%d
",i+1,s[i].score);
        printf("第%d个年龄:%d
",i+1,s[i].age);

    }

    //return 0;
}

int main(){

    Student stu1 ={"李辉",30,30};

    Student  s[10];  //声明10个Student 结构体的数组

    input(s,3);

    output(s,3);
    getchar();
    getchar();
    return 0;
}
何所为,不仅仅是一种态度,更是一种艺术!
原文地址:https://www.cnblogs.com/tanzizheng/p/12910581.html