Linux c 续小总结

来源:互联网 发布:uk域名注册 编辑:程序博客网 时间:2024/06/14 02:03

(1)const 标记它所在的内容只读;注意 const char *p="this is a str "两者都不可写;

(2)通过变参中有两个或是多个

1、可以返回传入的地址如:char *strcpy(char *dest, const char *src);

2、可以返回函数中静态内存的指针; static char *p;
3、可以返回动态分配的内存的指针 如:*p = malloc(20);

(3)注意下面几种类型

int *p[10];    // 指针数组

int (*p)[10];//数组指针

int (*p)(int); // 函数指针;
int (*p[10])(int);  //函数指针数组;
(4)回调函数的用法

typedef  int (*func_p)(int ,int );
int add(int a,int b)

{return a +b;}

func_p  fp;

fp=add;  //指针要一个函数的地址

fp(int a,int b);

(5)泛型函数

#include <stdio.h>
#include <string.h>
typedef int (*cmp_t)(void *,void *);
int cmp_int(void *a, void *b)
{
  return (int)(*(int *)a-*(int *)b);
}

void *max(void *base,int len,int size,cmp_t cmp)
{
   char *baseaddr=base, *maxp=base;
   int i;
   for (i = 0; i < len; i++)
   {
      if(cmp(maxp,baseaddr+i*size)<0)    
              maxp=baseaddr+i*size;
   }
    return (void *)maxp;
}
int main(int argc, const char *argv[])
{
      int arr[5]={2,3,45,5,6};
      printf("%d\n",*((int *)(max(arr,5,4,cmp_int))));
    return 0;
}

(6)变参函数 常用的Printf ,scanf 都是变参函数 而且第一个参数是常量,后面一般以...标记 一般实现通过标准库stdarg.h中的va_list类型及va_start、va_arg、va_end宏  注意:整型提升:若将获取的参数是char型,使用该宏应写为va_arg(ap, int)
小列子:

#include <stdio.h>
#include <stdarg.h>  //命名空间的引用
int max(int n,...)
{
   va_list ap;   //va_list 来实列化一个ap变量;
   int n1,i,tmp;

   va_start(ap,n);    // 变参函数常的开始形式;
   n1=va_arg(ap,int);
   n--;

     while(n>0)
     {
      tmp=va_arg(ap,int);  //va_arg(ap,int) 常用来得到后面的参数;注意一点的就是ap,int ,ap 取完一次就指向

                                        //一个地址了,后面的那个int就是我们常的的类型,

      if(n1>tmp)
      {
       tmp=n1;
      }
      n--;
     }
     va_end(ap);   //不要忘了后面对ap 的释放;
     return tmp;
}
int main(int argc, const char *argv[])
{
    printf("%d\n",max(3,0,2,1));//注意3,表示有3个参数;
    printf("%d\n",max(5,0,3,4,5,6)); //注意5;
    return 0;
}

(7)预处理 以#定义 如果下一行还要显示上行的内容可以用 \ 引用 可实现功能

1、文件包含 

2、宏定义替换 

//(1) 主要在替换两字  ;

//(2)#define max(a, b)    ((a) > (b) ? (a) : (b))  定义函数时所有参数都要用()

//(注意inline 函数);

//do{}while(0)形式;

3、取舍条件编译

(1#if , #endif, #ifdef, #ifndef, #elif, #else  #if DEBUG  defined()函数的运用 #if 0    endif;

(2#include <assert.h>  void assert(标量值或表达式)

(8)Makefile

CC=gcc //变量赋值  src=$(wildcard *.c) //利用Wildcar 函数取 当前文件中以.c 的所有文件;  targets=$(patsubst %.c,%,$(src))  //利用Patsubst  函数来生成相关的文件名;all:$(targets)  //all 的利用,$(变量名)这样可以取变量的值  CFLAGE= -Wall -g$(targets):%:%.c  //这种形式  $(CC) $(CFLAGE) $< -o $@   //(tab)命令clean: -rm -rf $(targets) .PHONY: all  clean //.PHONY的作用$@:表示规则中的目标$<:表示规则中的第一个条件$^:表示规则中的所有条件,组成一个列表,以空格隔开,如果这个列表中有重复的项则消除重复项