基本知识
- 符号常量的名字一般用大写。
- 一个NUL字节是指字节模式为全0的字节,即转义字符‘\0’,即ASCII码为0的字符。字符串是一串以NUL字节结尾的字符(不含NUL)。
- goto语句适合用于跳出多层嵌套的循环。
- 关系运算符(大于、小于、等于)产生的结果为整型值(0或1)。
- 逻辑运算符(与、或)是短路运算符。
- 如果同一条语句中调用了多个函数,这几个函数的调用顺序是不确定的,如果这些函数执行了I/O操作或修改了全局变量,则会产生错误的结果。
- 数组名的值是一个指针常量。
可变参数的函数
下面是一个用于求任意个数字的最小值的函数。
#include <stdio.h>
#include <stdarg.h>
const int inf=0x7fffffff;
int min(int n,...) //第一个参数n表示数字的个数
{
va_list p; //变量p用于遍历
int ans=inf;
va_start(p,n); //将p指向第一个元素
for(int i=1;i<=n;i++)
{
int num=va_arg(p,int); //调用va_arg,可以使p指向下一个元素
if(ans>num) ans=num;
}
va_end(p);
return ans;
}
int main ()
{
printf("%d\n",min(5,-3,4,5,2,1)); //调用函数时先输入数字个数
return 0;
}
关于指针
- 声明时int* a,b,c;等价于int *a; int b,c;,正确写法是int *a,*b,*c;
- 初始化时char *a=”hello”;相当于char *a; a=”hello”;
- b=*p++;等价于b=*p; p++;
- b=++*p;等价于b=++(*p); (后置自增运算符的优先级高于*)
- b=*++p;等价于p++; b=*p;
- b=++*++p;等价于b=++(*++p);
- b=++*p++;等价于b=++(*p); p++;
- (*a).b等价于a->b
#include <stdio.h>
int main()
{
int a[10]={1,2,3,4,5,6,7,8},*p,b;
p=a; //*p=a[0]=1
p=a+1; //*p=a[1]=2
b=*p++; //*p=a[2]=3,b=2
b=++*p; //*p=a[2]=4,b=4
b=(*p)++; //*p=a[2]=5,b=4
b=*++p; //*p=a[3]=4,b=4
b=++*++p; //*p=a[4]=6,b=6
b=++*p++; //*p=a[5]=6,b=7
}