C语言中的“小幽默”(二)

ps:今天刚把陈正冲老师《C语言深度解剖》看了一边,收获很多,最近一系列关于C语言知识的手记,都是自己调试过得,希望大家也多看看。不过看来还得学一门更高级的语言。C#?or Java?

 

 

 

逗号表达式

 

#include <stdio.h>

int main()

{

int a[3][2]={(0,1),(2,3),(4,5)};

//int a[3][2]={{0,1},{2,3},{4,5}};

int *p;

p=a[0];

printf("%d",p[0]);

return 0;

}

结果是:

1

要注意(0,1)之间的‘,’是一个逗号运算符,结果就是取运算符后面的那个值作为逗号运算的结果,所以这个例子结果就是:a[0][0]=1,a[0][1]=3,a[1][0]=5.

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

C语言之向函数传递一个数组

 

我们都知道C/C++语言中的函数都无法把一个数组作为一个实参传递进来,函数接收得只是一个指针。

当一个一维数组作为函数参数时,编译器总是把它解析成一个指向其首元素地址的指针。但是,这条规则并不是递归的,

只有一维数组才适用,当数组超过一维以后,将第一维改写成指向元素首地址以后,后面的维就不可在改写了。

如:

a[2][3][4]---->(*p)[3][4]

 

void foo(char a[]);

void foo(char a[4]);

对于foo()函数内部来说,两者是没有区别的。

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

无法把指针变量本身传递给一个函数

 

void GetMemory(char *p,int num)

{

  p=(char *)malloc(num*sizeof(char));

}

int main()

{

   char *str=NULL;

   GetMemory(str);

   strcpy(str,"hello");   //此处是错误,GetMemory获得的仅是str的一个拷贝,而不是其本身

   //要注意,str是局部变量,只不过在main函数中一直存在与内存中

   free(str);  //内存泄漏,str并没有获得一块地址

   return 0;

}

 

可行的方式:

1、return

void GetMemory(int num)

{

  char *p

  p=(char *)malloc(num*sizeof(char));

  return p;

}

int main()

{

   char *str=NULL;

   str=GetMemory(6);

   strcpy(str,"hello");

   free(str);

   return 0;

}

2、二维指针

void GetMemory(char **p,int num)

{

  *p=(char *)malloc(num*sizeof(char));

}

int main()

{

   char *str=NULL;

   GetMemory(&str);  //&str ,到GetMemory()里面*p 相当与*(&str)=str;

   strcpy(str,"hello");

   free(str);

   return 0;

 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值