c语法

#include <stdio.h>
#include <stdlib.h>

main(){
   //sizeof() 可以取出 属性类型 的长度    
   //&代表取地址 
       
       printf("char的长度为%d\n",sizeof(char));
       //signed  int 数据修饰符  有int的数据 
       // unsigned int 代表无符号的int的类型 
       //& 就代表获取一个一个变量的地址 
       //指针 就是变量在内容的地址
       //指针变量就是 存储指针的变量 
       
       /**
       
       %d  -  int
       %ld – long int
       %c  - char
       %f -  float
       %lf – double
       %x – 十六进制输出 int 或者long int 或者short int
       %o -  八进制输出
       %s – 字符串
       
       */
       
       /**
       定义一个指针变量 
       int*p ,int *P  ,int * p  三种形式定义指针变量 
       */ 
   
       int i =5;  
       int*p ; //定义一个指针变量
       p=&i; // 把i的地址给p 
       printf("%x",p); //22ff44
      
      
      //----------------------------------------------------- 
       /**
       *号操作符 
       含有:1. int* p  代表指针变量
             2. x*y     乘法运算
             3.  int*p; 取出指针变量的值  *p,*号在指针变量的 前面代表取出指针变量里面的 "数据"
       */ 
      
      //1.i的值改变p会变么? 不会,i的值该变了但是i的地址没有变 p是指针 存储是16进制 所以不变 ,i和p是俩回事 所以不影响
      
      //某个值的改变 是否改变其他值 要看是"地址" 还是 "数据值" 
      
      
      //----------------------------------------------------- 
      
      /**
         交换俩个数据 
      */
      int x =1;
      int y =2;
      int temp=0;
      swap(x,y); //不会改变 
      swap2(&x,&y);
      //c定义一个函数
      void swap(int x ,int y){
      temp = x;
      x = y;
      y = temp;
           } 
    
   // 不会交换: x,y (x,y) 分别有自己的地址 
      
   //使用指针变量的方式
   void swap2(int* x,int*y){
                   int temp = 0;
                   temp = *x;
                   *x = *y;
                   *y = temp;
        
        
        } 
        //java中的传递是 值传递还是引用传递?
       /**
        在java中只有值传递
        
        Person p = new Person();
        p 是地址,而我们在传递的时候其实是copy一个p而不是传递是引用 
         */
 //-----------------------------------------------------------------------------     
      
      /**
      
         指针常见的错误 
         //指针变量没有赋值不能使用 
         1.int*p ;
         print("*p = %d/n",*p); //read错误
         2.
         *p =123; //write 
      
         //类型错误 
         int i = 5;
         char* p = &i; //编译错误类型不匹配 
         
      */
 //-----------------------------------------------------------------------------
 
      /**
         不可以使用 已经被回收的变量 
      
      */
      
      int*p;
      f(&p); // 把地址传过去 
      printf("%#x\n",p); // 
      printf("%d\n",*p); //3 或-1 值取决于   printf("%#x\n",p); 
      //printf("%#x\n",p); 需要时间 所以方法里的 地址会被回收,而不打印没来得及回收 
      
      
      f(int**q){
       int i=3;
       *q = &i;          
      }
      
      
      //----------------------------------------- 
      
      
      /**
         指针和数组的关系 
      
      */
      
      // 打印一个字符串 
      char p[] = {'h','e','l','l','o','\0'};
      
      char* arr = "hello";
      
      //--------------------------------
      
      //指针的运算 
      
      //动态的内存分配
      /**
          需要使用 malloc memory allocate 内存 申请
           
      */ 
      #include <malloc.h> // 引入内存申请的头文件 
      
      main(){
             //在推内存中声请int类型的内存空间 
         int*p= (int*)malloc(sizeof(int)); //声请多大的内存空间 单位是byte 
             *p = 4; // 往p里存放地址  
             
             }
      
      free(摸个地址); //回收地址 
      //静态的内存分配 
      /**
      
      
      由系统分配给的堆内存,自动声请,自动释放 
      
      
      
      */ 
      
      
      
      
      
        //----------------------------------------- 
        /**
        多级指针 
        
        */ 
        
        int i =5;
        int*p = &i;
        int**q = &p;
        int***r = &q;
        println("%d\n",***r);
        //----------------------------------------- 
        
        /**
        函数指针 
        */
        int add(int x, int y){
            
            
            return x+y;
            }
        main(){
               int (*pf)(int x ,int y); //定义一个指针函数 
               }
        pf = add;
        println("d%\n",pf(3,2));
        //----------------3------------------------- 
        /**
           结构体 
        */
        // 定义结构体 
        struct Student{
               
           int age;
           long id;
           float sccor;            
               }
        main(){
               // 给结构体负责 
               stuct Student st={80,'f',55.6f};
               printl("age=%d\n",st.age);
               }
        
        // 结构体的长度
        println("长度=%d\n",sizeof(st)); 
        // 结构体指针
        struct Student*pst;
         priln("d%\n",(*pst).age); 
          priln("d%\n",pst->age); 
         
        
        //联合体的定义 
        // 使用的相同的内存空间 存放数据, 赋值的时候会覆盖,长度==最大数据类型的长度 
        struct data{int year, month,day} today; // 定义个结构体名字为today 
        
        union {long i; int k; char li;} mix; //定义一个联合体 
        
     //  联合体的作用:节省内存空间;
     //特点:长度 以最大类型相同 ,赋值 都是相同的值 ,存储在同一块内存空间 
           //----------------------------------------- 
           
           /**
              枚举 与java差不多 
           */ 
           
            /**
              typedep 定义类型 
           */
          typedep int ha; 
           ha i = 5;
           
           //----------------------------------------- 
       system("pause");
       }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值