码迷,mamicode.com
首页 > 编程语言 > 详细

c语言的指针

时间:2015-10-02 17:23:02      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:

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

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

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

 

c语言的指针

标签:

原文地址:http://www.cnblogs.com/wyc199288/p/4852417.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!