查看: 1943|回复: 0

[Linux技术] c语言使用注意事项(二)

[复制链接]
  • TA的每日心情

    2014-4-10 13:56
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2014-1-23 08:50:07 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 forlinx2013 于 2014-1-24 09:25 编辑

    欢迎大家来到飞凌爱板网专区,对嵌入式技术感兴趣的朋友不妨多多关注一下,我们提供了公司所有开发板的所有资料,也会更新大量技术文章,欢迎大家一块学习提高!!!

    1、如何使用指针调用函数
    如下例
    1 #include <stdio.h>  
    2 void func()  
    3 {  
    4         printf("asdfg\n");  
    5 }  
    6   
    7 void (*fp)();  
    8   
    9 int main(int argc,char **argv)  
    10 {  
    11         fp=func;  
    12         (*fp)();  
    13         return 0;  
    14 }  

    我们认为一个函数指针必须前面加上*后面加一个额外的括号从而转换成一个真正的函数,就如上例。
    但是下面的方法也可以正确执行
    15 #include <stdio.h>  
    16 void func()  
    17 {  
    18         printf("asdfg\n");  
    19 }  
    20   
    21 void (*fp)();  
    22   
    23 int main(int argc,char **argv)  
    24 {  
    25         fp=func;  
    26         fp();  
    27         return 0;  
    28 }  
    由于函数的调用其实就是通过指针实现,而真正的函数总是饮食的退化为指针。ANSI C解释*符号不再需要,但依然兼容。

    2strcpy,strncpy,strdup的用法和实现
    char * strcpy ( char * destination, const char * source );
    功能:复制字符串,复制sourcedestination,返回目的串的地址。
    源长>目标长,将源中长度等于目标长的部分复制到目的串
    源长<目标长,将源中全部字符复制到目的串,不包括最后的'\0'
    29 /***********************************************
    30  * 字符串复制函数
    31  * 源长>目标长,将源中长度等于目标长的部分复制到目的串
    32  * 源长<目标长,将源中全部字符复制到目的串,不包括最后的'\0'
    33  * ************************************/  
    34 char * strcpy(char * destination,const char * source)  
    35 {  
    36         if(destination == NULL || source == NULL) return NULL;  
    37         char * tmp=destination;  
    38         for(;*source != '\0';destination++,source++)  
    39         {  
    40                 *destination = *source;  
    41         }  
    42         return tmp;  
    43 }  

    例如
    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
    44 /**
    45  * strncpy - Copy a length-limited, %NUL-terminated string
    46  * @dest: Where to copy the string to
    47  * @src: Where to copy the string from
    48  * @count: The maximum number of bytes to copy
    49  *
    50  * The result is not %NUL-terminated if the source exceeds
    51  * @count bytes.
    52  *
    53  * In the case where the length of @src is less than  that  of
    54  * count, the remainder of @dest will be padded with %NUL.
    55  *
    56  */  
    57 char *strncpy(char *dest, const char *src, size_t count)  
    58 {  
    59         char *tmp = dest;  
    60   
    61         while (count) {  
    62                 if ((*tmp = *src) != 0)  
    63                         src++;  
    64                 tmp++;  
    65                 count--;  
    66         }  
    67         return dest;  
    68 }  
    char *strdup(char *src)
    功能:将src字符串复制到新的位置,返回值即为目的串地址,其目的串地址是由malloc()分配,使用完毕须用free()释放。
    69 char *strdup(char *src)  
    70  {  
    71         char *tmp = NULL;  
    72         if(src!=NULL && (tmp=malloc(strlen(src)+1)) !=NULL )  
    73                 strcpy(tmp,src);  
    74         return tmp;  
    75  }  


    3NULL(空指针)到底是什么?
    每个指针都有一个特殊的值,空NULL,这与其他对象或函数的地址都不相同,也就是说在程序中通过&(取地址运算符)永远无法得到NULL地址。
    当一个指针类型的变量被赋予0值,那么编译器在编译的时候会将其作为NULL指针,即在指针初始化、比较、赋值的时候NULL可用0代替。即自己定义
    #define NULL 0
    如果NULL要以函数参数传递的时候,编译器可能不知道这是指针类型的变量而把其当作是常数0看待,这是可以进行强制类型转换(char *)0来使编译器将其作为NULL来使用。即
    #define NULL ((void *)0)
    所以空指针的使用注意
    *在源码中使用空指针常数时,则使用0NULL
    *在函数的参数传递时如果使用空指针,则使用NULL或相应的类型指针0(type *)0

    4if(p)这样判断是否是空指针正确吗?
    if(p)相当于if(p != 0)
    完全合法,但是一些人认为这样的风格不好。
    在指针上下文中NULL0是完全等价的。

    5char a[n]char *a的区别
    例如:
    char a[6]="world";
    表示定义一个有6个存储空间的连续地址空间,首地址是a,故a可以修改。
    char *p="world";
    表示定义一个指针,该指针指向一个有6个连续地址空间的首地址。
    如下图示意:

    6、和5不同,为什么在函数参数中指针和数组可以等价
    76 void func(char a[])  
    77 {  
    78 ........  
    79 }  

    80 void func(char *a)  
    81 {  
    82 ........  
    83 }  

    相同,这种等价只局限于形参的传递,别的地方并不适用。

    7、和5不同的是,C语言中“指针与数组等价”该如何理解?
    数组的定义中,如果一个数组变量出现在=的左边,即作为左值出现,那么它立刻蜕化为一个相应类型的指针。

    8、如何给二位数组动态分配内存?
    84 int dmalloc(int **arg)  
    85 {  
    86         int cols=6;  
    87         int rows=6;  
    88         arg=malloc( rows*sizeof(int *) );  
    89         int i,j;  
    90         for(i=0;i<cols;i++)  
    91         {  
    92                 arg=malloc( cols*sizeof(int) );  
    93         }  
    94         for(i=0;i<rows;i++)  
    95         {  
    96                 for(j=0;j<cols;j++) arg[j]=i*j,printf("%d ",arg[j]);  
    97                 printf("\n");  
    98         }  
    99         for(i=0;i<cols;i++) free(arg);  
    100         free(arg);  
    101 }  
    9、二维数组参数的传递的方法
    int arr[rows][cols];
    102 void func(int arr[][cols])  
    103 {  
    104 .............  
    105 }  

    或者
    106 typedef ap *arr  
    107 void func(int ap[cols])  
    108 {  
    109 .............  
    110 }  

    10、当数组以参数的方式传递后,参数内sizeof()无法获得数组的大小
    由于数组以形参传递后,实质是传递的一个指针,首地址,所以在函数内通过sizeof获得的不是数组的大小,而是指针的大小。
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-5-16 17:49 , Processed in 0.110174 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.