(1)const 标记它所在的内容只读;注意 const char *p="this is a str "两者都不可写;
(2)通过变参中有两个或是多个
1、可以返回传入的地址如:char *strcpy(char *dest, const char *src);
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的作用
$@:表示规则中的目标
$<:表示规则中的第一个条件
$^:表示规则中的所有条件,组成一个列表,以空格隔开,如果这个列表中有重复的项则消除重复项