标签:
从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销毁,但是内存的值已经改变。
所以在指针操作中:关键要抓住改变的是什么?内存值还是地址?生命周期是多长?
虽然写的是软件,但是有硬件的意味在里面。
标签:
原文地址:http://www.cnblogs.com/wyc199288/p/4852417.html