zoukankan      html  css  js  c++  java
  • c语言的指针

    从c#等高级语言转到c语言有一段时间了,感觉c的指针真是高深莫测。用好的话,效率很高,很屌!!!

    本人还真是无聊,先把c的东西都封成了matlab的模样。对于二维数组那首当其冲了。

    总不能一直double matrix[100][100]吧,静态分配太消耗内存了,而且有些时候编译不过去。

    所以来不定长的二维分配:

    #define row 100
    #deifne col   100
    
    double **matrix;
    int i;
    matrix=(double**)malloc(sizeof(double*)*row);//分配行指针
    
    for(i=0;i<;i++)
    {
      matrix[i]=(double*)malloc(sizeof(double)*col);//循环分配列指针          
    }

    这样就可以像matlab那样用了。其他分配类似。

    还有一个问题是:关于类似c#一样的参数out和ref问题,在c语言中可以用指针实现。不过前提是在fun(int *a,int *b)。a和b都已经是分配好的内存。因为形参在函数结束后就会销毁。

    类似如此:

    void try(int *a,int *b)
    {
      b=a;  
    }
    
    int main(void)
    {
      int temp[10]={11,22,33};
      int *pp;  
      try(temp,pp);  
      return 0;
    }

    这样的pp是无法输出temp的值的。虽然在try函数中将temp的地址赋给了形参bb,但是函数返回时,b和a都销毁了。如下,给pp分配:

    void try(int *a,int *b)
    {
      b=a;  
    }
    
    int main(void)
    {
      int temp[10]={11,22,33};
      int *pp;  
      pp=(int*)malloc(sizeof(int)*10);  
      try(temp,pp);  
      return 0;
    }

    这样输出的pp全是0,原因相同,在aa中的操作并没有将a赋给b。

    void try(int *a,int *b)
    {
      b[0]=b[0]+a[0];
    }
    
    int main(void)
    {
      int temp[10]={11,22,33};
      int *pp;  
      pp=(int*)malloc(sizeof(int)*10);  
      try(temp,pp);  
      return 0;
    }

    这样就可以,因为在try中把pp的第一个与temp的第一个相加了并在pp的内存中重新赋值,此时pp的第一个值内存已经改写,函数结束后虽然a和b销毁,但是内存的值已经改变。

    所以在指针操作中:关键要抓住改变的是什么?内存值还是地址?生命周期是多长?

    虽然写的是软件,但是有硬件的意味在里面。

  • 相关阅读:
    log4j2配置详解
    【数据库性能相关知识汇总】
    【Java并发知识点汇总】
    Spring实践系列-入门篇(一)
    分布式实践之概念解析
    平时工作需要注意总结面试中必然会问到的问题
    DataX支持mysql8.X
    springboot集成shiro
    ELK 6.2.4搭建
    DataX-MysqlWriter 插件文档
  • 原文地址:https://www.cnblogs.com/wyc199288/p/4852417.html
Copyright © 2011-2022 走看看