EazyChange

导航

 

从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销毁,但是内存的值已经改变。

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

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

 

posted on 2015-10-02 17:05  EazyChange  阅读(365)  评论(0编辑  收藏  举报