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;
}