原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7235085
更多查看
C语言使用注意事项(一)
C语言使用注意事项(三)
C语言使用注意事项(四)
1、如何使用指针调用函数
如下例
#include
void func()
{
printf("asdfg\n");
}
void (*fp)();
int main(int argc,char **argv)
{
fp=func;
(*fp)();
return 0;
}
但是下面的方法也可以正确执行
#include
void func()
{
printf("asdfg\n");
}
void (*fp)();
int main(int argc,char **argv)
{
fp=func;
fp();
return 0;
}
由于函数的调用其实就是通过指针实现,而真正的函数总是饮食的退化为指针。ANSI C解释*符号不再需要,但依然兼容。
2、strcpy,strncpy,strdup的用法和实现
char * strcpy ( char * destination, const char * source );
功能:复制字符串,复制source至destination,返回目的串的地址。
源长>目标长,将源中长度等于目标长的部分复制到目的串
源长<目标长,将源中全部字符复制到目的串,不包括最后的'\0'
/***********************************************
* 字符串复制函数
* 源长>目标长,将源中长度等于目标长的部分复制到目的串
* 源长<目标长,将源中全部字符复制到目的串,不包括最后的'\0'
* ************************************/
char * strcpy(char * destination,const char * source)
{
if(destination == NULL || source == NULL) return NULL;
char * tmp=destination;
for(;*source != '\0';destination++,source++)
{
*destination = *source;
}
return tmp;
}
char* src="how are you ?";
char des[20]="ABCDEFGHIJKLMNOPQRS;
strcpy(des,src);
结果des为
char * strncpy ( char * destination, const char * source, size_t num );
功能:复制字符串,复制源中定长的字符串到目标字符串
目标长>指定长>源长,则将源长全部拷贝到目标长,自动加上'\0'
指定长<源长,则将源长中按指定长度拷贝到目标字符串,不包括'\0'
指定长>目标长,出错ERROR
/**
* strncpy - Copy a length-limited, %NUL-terminated string
* @dest: Where to copy the string to
* @src: Where to copy the string from
* @count: The maximum number of bytes to copy
*
* The result is not %NUL-terminated if the source exceeds
* @count bytes.
*
* In the case where the length of @src is less than that of
* count, the remainder of @dest will be padded with %NUL.
*
*/
char *strncpy(char *dest, const char *src, size_t count)
{
char *tmp = dest;
while (count) {
if ((*tmp = *src) != 0)
src++;
tmp++;
count--;
}
return dest;
}
char *strdup(char *src)
char *strdup(char *src)
{
char *tmp = NULL;
if(src!=NULL && (tmp=malloc(strlen(src)+1)) !=NULL )
strcpy(tmp,src);
return tmp;
}
每个指针都有一个特殊的值,空NULL,这与其他对象或函数的地址都不相同,也就是说在程序中通过&(取地址运算符)永远无法得到NULL地址。
当一个指针类型的变量被赋予0值,那么编译器在编译的时候会将其作为NULL指针,即在指针初始化、比较、赋值的时候NULL可用0代替。即自己定义
#define NULL 0
如果NULL要以函数参数传递的时候,编译器可能不知道这是指针类型的变量而把其当作是常数0看待,这是可以进行强制类型转换(char *)0来使编译器将其作为NULL来使用。即
#define NULL ((void *)0)
所以空指针的使用注意
*在源码中使用空指针常数时,则使用0或NULL
*在函数的参数传递时如果使用空指针,则使用NULL或相应的类型指针0((type *)0)
4、if(p)这样判断是否是空指针正确吗?
if(p)相当于if(p != 0)
完全合法,但是一些人认为这样的风格不好。
在指针上下文中NULL和0是完全等价的。
5、char a[n]和char *a的区别
例如:
char a[6]="world";
表示定义一个有6个存储空间的连续地址空间,首地址是a,故a[i]可以修改。
char *p="world";
表示定义一个指针,该指针指向一个有6个连续地址空间的首地址。
如下图示意:
6、和5不同,为什么在函数参数中指针和数组可以等价
void func(char a[])
{
........
}
void func(char *a)
{
........
}
7、和5不同的是,C语言中“指针与数组等价”该如何理解?
数组的定义中,如果一个数组变量出现在=的左边,即作为左值出现,那么它立刻蜕化为一个相应类型的指针。
8、如何给二位数组动态分配内存?
int dmalloc(int **arg)
{
int cols=6;
int rows=6;
arg=malloc( rows*sizeof(int *) );
int i,j;
for(i=0;i
9、二维数组参数的传递的方法
int arr[rows][cols];
void func(int arr[][cols])
{
.............
}
typedef ap *arr
void func(int ap[cols])
{
.............
}
由于数组以形参传递后,实质是传递的一个指针,首地址,所以在函数内通过sizeof获得的不是数组的大小,而是指针的大小。