C语言学习笔记

第一部分C语言的组成

一.基本数据类型

  1. java中有八中基本数据类型,而在c/c++中没有byte和boolean(在C中0为false,非0为true)
  2. 在c语言中多了long long unsiged(无符号,只能大于等于0)singned整形修饰
  3. 和java语言同一种数据类型所占内存大小不一致,char,long
  4. sizeof运算符,计算当前数据类型所占用的字节的大小,如果传入变量名称,计算出变量对应的数据类型的长度
  5. C的基本数据类型(九种数据类型)
    char ,int , float ,double , signed ,unsigned ,long ,short and void;
  6. java中的数据类型和C语言的数据类型对比
            java                C
    1   boolean byte        char
    2   char  short         short
    4   int  float          int long float
    8   long  double        double ,long long

二.基本输入输出函数

  1. 在c语言中都是先声明在使用的,printf输出函数和scanf输入函数均在头文件中已声明

  2. 数据输入或者输出的表现形式

         %d  -  int
         %ld – long int
         %c  - char
         %f -  float
         %u – 无符号数
         %hd – 短整型
         %lf – double
         %x – 十六进制输出 int 或者long int 或者short int
         %o -  八进制输出
         %s – 字符串
         %p-指针
             
     scanf("%d",&i);//将int变量i的地址传递  输入数据赋值给i的地址对应的数据  \n不能停止输入
     printf("i=%d\n",i); 
    

三.指针

  1. 指针就是内存地址
  2. 内存的特点
    1. 最小单位是byte
    2. 内存是线性连续的排列
    3. 32为操作系统最大的内存4G ,操作系统管理的一段内存空间,32位操作系统每一个进程的最大可用内存是4G,4G=2^32=4294967296
  3. 什么是指针
    1. 对内存最小单元进行编号 0~~4294967295
    2. 每一个内存单元的编号称之为指针
    3. 指针就是内存地址
  4. 指针的作用
    1. 可以直接访问硬件
    2. 快速传递数据
    3. 表示复杂的数据结构
    4. 方便处理字符串等
  5. 指针访问内存的运算符
    1. &取地址运算符 &变量名

    2. *取对象运算符 *指针

       #include 
       int main(){
           int i;//在内存中申请4个字节内存  申请大小根据数据类型确定
           i=10;//通过变量名操作这段内存
           printf("i=%d\n",i); 
           
           //通过取地址运算符获取变量i的内存地址
           &i;
           //通过*取对象运算符操作内存地址对应的内存空间
           *&i = 20;
           
           printf("i=%d\n",i); 
           return 0;
       }
      
  6. 指针变量
    1. 保存指针的变量也就是保存地址的变量;
    2. 指针变量的定义: 保存指针的数据类型 * 变量名
    3. 指针变量在32位操作系统上的内存大小为4个字节(固定的)
  7. 指针的数据类型和指针类型
    1. 指针类型: 指针变量去掉变量名 保存首地址对应的变量类型*
    2. 指针的数据类型: 指针变量指向的变量数据类型
    3. 指针的数据类型不确定指针变量占用的内存大小,决定指针变量访问的内存长度
  8. 值传递和引用传递
    1. java中:
      • 基本数据类型都是值传递
      • 对象传递都是引用传递
    2. C语言中:一般都是值传递
  9. 指针常见的一些错误
    1. 混用不同的指针 不同指针变量不能直接赋值,可强转之后再赋值,但需保证强转有意义
    2. 野指针 定义的指针变量没有合法指向,没有保存任何变量的首地址;
      • 定义指针变量要有合法的指向,如果暂时没有就指向NULL指针 int *pi=NULL
      • NULL指针不可读不可写,访问就会报错;

四.数组

  1. 数组

    • java数组对象 c语言数组相同数据类型的集合;

    • 定义数组: int arr【4】;

    • 访问数组: arr【0】 arr【1】 C语言不检查角标越界;

    • 求数组元素个数: sizeof(arr)/sizeof(arr【0】)

    • 数组名代表首元素首地址

    • 数组的传递需要传递数组名和数组元素的个数

        void print_arr(char arr[4],int count){
            int i=0;
            for(i=0;i
  2. 指针和数组之间的关系

    • 数组名代表首元素首地址

    • C语言中不检查角标越界

      int *pi=arr
      *(pi+0)《==》pi[0] …… *(pi+3)《==》pi[3]

  3. 进程的内存分布
    · - 局部变量 被{}包裹的变量 作用范围再{}以内 生命周期执行完{}后销毁

    • 全部变量 没有被任意的{}包裹 可以一直使用
    • static修饰局部变量 作用范围不变,生命周期和全局变量一直
  4. void *指针

    • 不同类型的指针不可以直接赋值需要强转之后才可赋值然而对于void*指针则可以直接进行赋值不需要强转,这个就是这个指针的特点;
    • 对于java中object类型的数据转化可以用void*指针来接受,
  5. malloc和free使用

  6. 字符串

    • c语言中没有字符串,以字符数组表示字符串,以“\0”作为字符串的结束标记
    • 字符串的定义---两种定义方式
            //按照字符数组方式定义字符串 
            //hello 
            //  char arr[6]={'h','e','l','l','o','\0'};
            //  char arr[6]={"hello"};
                char arr[6]="hel"; 
                int coun;
            //  arr[0]='d';
            //  printf("arr=%s\n",arr);
                
                //定义数组方式二 
            //  char *pc = "hello"; //定义了字符串常量 
            //  char *pc=arr;//定义普通字符串 可以修改字符串的数据 
            //  *pc='r';
            //  char *pc=NULL;
            //  pc="hello";
            //  *pc='p';    

- 字符串的传递只需要传递字符串首元素首地址,有\0结束标记
- 字符串求长度:便利字符数组找到\0结束标记
- 字符串函数

            - //字符串长度   coun = strlen(arr);
            - 字符串比较 int c = strcmp(arr,arr1); 

五.结构体

  1. 定义结构体,三种类型,普通的结构体,全局的结构体,匿名的结构体;

         #include 
         //定义结构体类型  int 
         struct Student{//struct 结构体标识  Student 结构体名 
             char *name;//姓名
             int age;
             float score; 
         };
         
         struct Student{//struct 结构体标识  Student 结构体名 
             char *name;//姓名
             int age;
             float score; 
         }stu;//定义结构体类型全局变量 
         
         
         struct{//struct 结构体标识  Student 结构体名 
             char *name;//姓名
             int age;
             float score; 
         }stu;//匿名结构体  只能定义一个变量 
         int main(){
             //结构体类型变量
             struct Student  stu;//局部变量 
             return 0;
         }
    
  2. 访问结构体中的字段

         stu.name="hello";
         stu.age=23;
         stu.score=59.9;
    
  3. 结构体传递属于值传递

  4. 结构体定义指针 - struct Student *pstu

  5. 通过结构体一级指针访问结构体字段

    • (*pstu).name
    • 通过一级指针指向访问pstu->name

6.联合体union
- 不能够同时操作多个字段,只能一次操作一个字段
- 联合体内存是里面最大字段占用的内存

六. 枚举

七. typedef关键字 起别名

  1. 作用:
    1. 可以简化定义,某些函数指针名或者结构体指针比较长,可以通过起别名的方式来定义,此种方式可以简化代码;
            int i;//i变量名
            typedef int i;//i代表int数据类型
            i a;//定义了int数据类型
            
            struct Student stu;//stu结构体变量名
            typedef struct Student stu;//stu 代表结构体类型 struct Student 
            stu sstu;//定义了结构体类型的变量
    
            void (*padd)(int,int,int *);//padd函数指针变量名  
            typedef void (*padd)(int,int,int *);//padd代表指针类型 
            padd ppadd;

你可能感兴趣的:(C语言学习笔记)