目录
1、void指针、null指针、指向变量的指针、指针变量
2、参数、传参、可变参数
3、指针函数、函数指针
4、作用域、全局变量、extern、声明与定义
5、生存期、存储类型、递归
6、完整函数执行
1、void指针、null指针、指向变量的指针、指针变量
#include
int main()
{
int num=1024;
int *pi=#
char *ps="FishC";
void *pv;
pv=pi;
printf("pi:%p,pv:%pn",pi,pv);
//printf("pv:%d",*pv);//报错 不可直接解引用
printf("*pv:%dn",*(int *)pv);
pv=ps;
printf("ps:%p,pv:%pn",ps,pv);
printf("*pv:%sn",pv);
printf("*pv:%sn",(char *)pv);
return 0;
}
[wlp@192 class_1]$ gcc test5.c && ./a.out
pi:0x7fff9505c5b4,pv:0x7fff9505c5b4
ps:0x400630,pv:0x400630
[wlp@192 class_1]$ gcc test5.c && ./a.out
pi:0x7fff489f1414,pv:0x7fff489f1414
*pv:1024
ps:0x400670,pv:0x400670
*pv:FishC
*pv:FishC
#include
int main()
{
const float pi=3.14;
printf("%fn",pi);
return 0;
}
#include
int main()
{
int num=520;
const int cnum=880;
const int *pc=&cnum;
printf("cnum:%d,&cnum:%pn",cnum,&cnum);
printf("*pc:%d,pc:%p",*pc,pc);
pc=#
printf("num:%d,&num:%pn",num,&num);
printf("*pc:%d,pc:%p",*pc,pc);
return 0;
}
cnum:880,&cnum:0x400630
*pc:880,pc:0x400630
num:520,&num:0x400670
*pc:520,pc:0x400670
//1
#include
int main()
{
int num=520;
const int cnum=880;
int *const p=#
*p=1024;
printf("*p:%dn",*p);//指针指向的值可以改变
p=&cnum;
printf("*p:%dn",*P);//报错;指针本身的值不可变
return 0;
}
//2
int main()
{
int num=520;
const int cnum=880;
const int *const p=&cnum;
*p=1024;
printf("*p:%dn",*p);//报错
p=&cnum;
printf("*p:%dn",*P);//报错
return 0;
}
//2.1、
int main()
{
int num=520;
const int cnum=880;
const int *const p=#
const int *const *pp=&p;
printf("pp:%p,&p:%pn",pp,&p);
printf("*pp:%p,p:%p,&num:%pn",*pp,p,&num);
printf("**pp:%d,*p:%d,num:%dn",**pp,*p,num);
return 0;
}
pp:0x111,&p:0x111
*pp:0x115,p:0x115,&num:0x115
**pp:520,*p:520,num:520
2、参数、传参、可变参数
#include
void printf_C();//声明函数【编译代码从上到下时可省略】
void printf_C()//定义函数
{
printf("#####n");
printf("## ##n");
printf("## n");
printf("## n");
printf("## ##n");
printf("#####n");
}
int main()
{
printf_C();//调用函数
return 0;
}
//输入一个整数,计算0+1+2+...+n的结果
#include
int sum(int n);
int sum(int n)//形参
{
int result=0;
while(n-->0)
{
result+=n;
}
return result;
}
int main()
{
int n;
printf("请输入:");
scanf("%d",&n);
a=sum(n);//实参【赋值调用】
printf("结果是:%dn",a);
return 0;
}
//输入两个整数输出较大的一个
#include
int max(int x,int y);
int max(int x,int y)
{
if(x>y)
{
return x;
}
else
{
return y;
}
printf("我好帅n");//这里不会执行,遇到return就返回了,不会继续向下执行
}
int main()
{
int a,b,c;
printf("请输入两个整数:");
scanf("%d %d",&a,&b);
c=max(a,b);
printf("较大的数是:%dn",c);
return 0;
}
// 传地址 、、
#include
void swap(int *x,int *y);
void swap(int *x,int *y)
{
int temp;
printf("swap函数里:互换前:x=%d,y=%dn",*x,*y);
temp=*x;
*x=*y;
*y=temp;
printf("swap函数里:互换后:x=%d,y=%dn",*x,*y);
}
int main()
{
int x=3,y=5;
printf("int函数里:互换前:x=%d,y=%dn",x,y);
swap(&x,&y);
printf("int函数里:互换后:x=%d,y=%dn",x,y);//互换的是地址,所以main里的x,y也被换了
return 0;
}
[wlp@192 class_2]$ gcc test2.c && ./a.out
int函数里:互换前:x=3,y=5
swap函数里:互换前:x=3,y=5
swap函数里:互换后:x=5,y=3
int函数里:互换后:x=5,y=3
//传数值 【上面代码把*去掉】main函数和swap函数里的x,y是各自的,没有关系
//传数组【传递的是地址】
#include
void get_array(int a[10]);
void get_array(int a[10])
{
int i;
for(i=0;i<10;i++)
{
printf("a[%d]=%dn",i,a[i]);
}
}
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,0};
get_array(a);
return 0;
}
==
#include
void get_array(int b[]);
void get_array(int b[])//行参
{
printf("sizeof b:%dn",sizeof(b));
}
int main()
{
int a[]={1,2,3,4,5,6,7,8,9,0};
printf("sizeod a:%dn",sizeof(a));
get_array(a);//实参 传数组传的是地址
return 0;
}
[wlp@192 class_2]$ gcc test4.c && ./a.out
sizeod a:40
sizeof b:8
#include
#include
int sum(int n,...);//n为参数个数 ...参数个数不确定
int sum(int n,...)
{
int i,sum=0;
va_list vap;//定义参数列表vap
va_start(vap,n);//初始化参数列表
for(i=0;i
3、指针函数、函数指针
#include
char *getWord(char);
char *getWord(char c)
{
char str[]="Dog";//str[] 局部变量
switch(c)
{
case 'A':return "Apple";
case 'B':return "Banana";
case 'C':
return "Cat";
case 'D':return str;//报错
default:
return "None";
}
}
int main()
{
char intput;
printf("请输入一个字母:");
scanf("%c",&intput);
printf("%sn",getWord(intput));
return 0;
}
#include
int square(int);
int square(int num)
{
return num*num;
}
int main()
{
int num;
int (*fp)(int);
printf("请输入一个整数:");
scanf("%d",&num);
fp=square;//函数名就是函数地址
printf("%d*%d=%dn",num,num,(*fp)(num));
return 0;
}
//函数指针做参数
#include
int add(int,int);
int sub(int,int);
int calc(int (*)(int,int),int,int);//三个参数,第一个参数为指针,指针指向函数【即 第一个参数为新定义的函数名】
// 指向的函数有两个整形参数 返回值类型为整型
int add(int num1,int num2)
{
return num1+num2;
}
int sub(int num1,int num2)
{
return num1-num2;
}
int calc(int (*fp)(int,int),int num1,int num2)
{
return (*fp)(num1,num2);
}
int main()
{
printf("3+5=%dn",calc(add,3,5));
printf("3-5=%dn",calc(sub,3,5));
return 0;
}
==
//函数指针做返回值
#include
int add(int,int);
int sub(int,int);
int calc(int (*)(int,int),int,int);
int (*select(char))(int,int);//函数名select,参数为char类型,返回值类型为指针,指针指向得是(int,int)的函数
//即:指针指向的是有两个整形参数的函数
int add(int num1,int num2)
{
return num1+num2;
}
int sub(int num1,int num2)
{
return num1-num2;
}
int calc(int (*fp)(int,int),int num1,int num2)
{
return (*fp)(num1,num2);
}
int (*select(char op))(int,int)
{
switch(op)
{
case '+':return add;
case '-':return sub;
}
}
int main()
{
int num1,num2;
char op;
int (*fp)(int,int);//定义函数指针fp来接收
printf("请输入一个式子 如(1+2):");
scanf("%d%c%d",&num1,&op,&num2);
fp=select(op);
printf("%d%c%d=%dn",num1,op,num2,calc(fp,num1,num2));
return 0;
}
4、作用域、全局变量、extern、声明与定义
#include
int main()
{
int i=520;
printf("before:i=%dn",i);
for(int i;i<10;i++)//这里的i,仅限于for语句里使用。
{
printf("%dn",i);
}
printf("after:i=%dn",i);
return 0;
}
[wlp@192 class_2]$ gcc -std=c99 test5.c && ./a.out//执行选项指定c99
before:i=520
0
1
2
3
4
5
6
7
8
9
after:i=520
#include
void a();
void b();
void c();
int count=0;//不写默认为0
void a()
{
count++;
}
void b()
{
count++;
}
void c()
{
count++;
}
int main()
{
a();
b();
c();
printf("%dn",count);//3
return 0;
}
==
#include
void func();
int a,b=520;//这里全局变量a,b,a默认为0
void func()//函数里是进行局部变量操作
{
int b;
a=880;
b=120;
printf("in func(),a=%d,b=%dn",a,b);
}
int main()
{
printf("in main(),a=%d,b=%dn",a,b);
func();
printf("in main(),a=%d,b=%dn",a,b);
return 0;
}
[wlp@192 class_2]$ gcc test5.c && ./a.out
in main(),a=0,b=520
in func(),a=880,b=120//这里改动的b为局部变量,并没有改变b的全局变量;
//不过因为全局变量a没有赋值,虽然有默认值,但这里第一次修改a的局部变量,便看做为a的全局变量。
in main(),a=880,b=520//这里输出的是全局变量a,b
#include
void func();
void func()
{
extern count;
count++;
}
int count=0;
int main()
{
func();
printf("%dn",count);
return 0;
}
[wlp@192 class_2]$ gcc test5.c && ./a.out
1
==
#include
int main(void)
{
int i=100;//i1
{
int i=110;//i2
{
int i=120;//i3
printf("i=%dn",i);
}
{
printf("i=%dn",i);
int i=130;//i4
printf("i=%dn",i);
}
printf("i=%dn",i);
}
printf("i=%dn",i);
return 0;
}
[wlp@192 class_2]$ gcc test5.c && ./a.out
i=120
i=110
i=130
i=110
i=100
5、生存期、存储类型、递归
#include
void func(void);
void func(void)
{
static int count=0;//作用域没变,但存储位置,生存期改变。
printf("count=%dn",count);
count++;
}
int main()
{
//count++;//报错,因为作用域没变
int i;
for(i=0;i<10;i++)
{
func();
}
return 0;
}
==
#include
int f(int a)
{
auto int b=0;
static int c=3;
b=b+1;
c=c+1;
return (a+b+c);
}
void main()
{
int a=2,i;
for(i=0;i<3;i++)
{
printf("%dn",f(a));//7,8,9
}
}
//输入两个数,求出3*第一个数和,一个数的另一个数次方
文件1
#include
int A;
void main()
{
int power(int);
int b=3,c,result,m;
printf("前请输入A的值和他的平方数:n");
scanf("%d %d",&A,&m);
c=A*b;
printf("%d*%d=%dn",A,b,c);//结果c
d=power(m);
printf("%d^%d=%dn",A,m,result);//结果result
}
文件2
#include
extern A;//声明一个已定义的外部变量
int power(int n)
{
int i,y=1;
for(i=1;i<=n;i++)
{
y*=A;
}
return y;
}
//求阶乘
#include
long fact(int num);
long fact(int num)
{
long result;
for(result=1;num>1;num--)
{
result*=num;
}
return result;
}
int main(void)
{
int num;
printf("请输入一个正整数:");
scanf("%d",&num);
printf("%d的阶乘是:%dn",num,fact(num));
return 0;
}
==
#include
long fact(int num);
long fact(int num)
{
long result;
if(num>0)
{
result=num*fact(num-1);
}
else //结束条件
{
result=1;
}
return result;
}
int main(void)
{
int num;
printf("请输入一个正整数:");
scanf("%d",&num);
printf("%d的阶乘是:%dn",num,fact(num));
return 0;
}
//汉诺塔游戏
#include
void hanoi(int n,char x,char y,char z);
void hanoi(int n,char x,char y,char z)
{
if(n==1)
{
printf("%c-->%cn",x,y);
}
else
{
hanoi(n-1,x,z,y);
printf("%c-->%cn",x,z);
hanoi(n-1,y,x,z);
}
}
int main(void)
{
int n;
printf("输入汉诺塔层数:");
scanf("%d",&n);
hanoi(n,'X','Y','Z');
return 0;
}
6、完整函数执行
//定义一个字符串,将想要删除的字符输入,并打印字符串
文件1//主文件
#include
void main
{
//声明在其他文件定义的函数
extern void enter_string(char str[]);
void delete_string(char str[],char ch);
void print_string(char str[]);
char c;
char str[80];
//调用其他文件的函数
enter_string(str);
scanf("%c",&c);
delete_string(str,c);
print_string(str);
}
文件2//向数组输入字符串
#include
void enter_string(char str[80])
{
gets(str);
}
文件3//将余下数组元素复制
#include
void delete_string(char str[],char ch)
{
int i,j;
for(i=j=0;str[i]!=' ';i++)
{
if(str[i]!=ch)
{
str[j++]=str[i];
}
}
str[j]=' ';
}
文件4
#include
void printf_string(char str[])
{
printf("%sn",str);
}
C语言基础语法【1】_z输关的博客-CSDN博客
C语言基础语法【2】_z输关的博客-CSDN博客
#includevoid printf_C();//声明函数【编译代码从上到下时可省略】 void printf_C()//定义函数 { printf("#####n"); printf("## ##n"); printf("## n"); printf("## n"); printf("## ##n"); printf("#####n"); } int main() { printf_C();//调用函数 return 0; } //输入一个整数,计算0+1+2+...+n的结果 #include int sum(int n); int sum(int n)//形参 { int result=0; while(n-->0) { result+=n; } return result; } int main() { int n; printf("请输入:"); scanf("%d",&n); a=sum(n);//实参【赋值调用】 printf("结果是:%dn",a); return 0; } //输入两个整数输出较大的一个 #include int max(int x,int y); int max(int x,int y) { if(x>y) { return x; } else { return y; } printf("我好帅n");//这里不会执行,遇到return就返回了,不会继续向下执行 } int main() { int a,b,c; printf("请输入两个整数:"); scanf("%d %d",&a,&b); c=max(a,b); printf("较大的数是:%dn",c); return 0; } // 传地址 、、 #include void swap(int *x,int *y); void swap(int *x,int *y) { int temp; printf("swap函数里:互换前:x=%d,y=%dn",*x,*y); temp=*x; *x=*y; *y=temp; printf("swap函数里:互换后:x=%d,y=%dn",*x,*y); } int main() { int x=3,y=5; printf("int函数里:互换前:x=%d,y=%dn",x,y); swap(&x,&y); printf("int函数里:互换后:x=%d,y=%dn",x,y);//互换的是地址,所以main里的x,y也被换了 return 0; } [wlp@192 class_2]$ gcc test2.c && ./a.out int函数里:互换前:x=3,y=5 swap函数里:互换前:x=3,y=5 swap函数里:互换后:x=5,y=3 int函数里:互换后:x=5,y=3 //传数值 【上面代码把*去掉】main函数和swap函数里的x,y是各自的,没有关系 //传数组【传递的是地址】 #include void get_array(int a[10]); void get_array(int a[10]) { int i; for(i=0;i<10;i++) { printf("a[%d]=%dn",i,a[i]); } } int main() { int a[10]={1,2,3,4,5,6,7,8,9,0}; get_array(a); return 0; } == #include void get_array(int b[]); void get_array(int b[])//行参 { printf("sizeof b:%dn",sizeof(b)); } int main() { int a[]={1,2,3,4,5,6,7,8,9,0}; printf("sizeod a:%dn",sizeof(a)); get_array(a);//实参 传数组传的是地址 return 0; } [wlp@192 class_2]$ gcc test4.c && ./a.out sizeod a:40 sizeof b:8 #include #include int sum(int n,...);//n为参数个数 ...参数个数不确定 int sum(int n,...) { int i,sum=0; va_list vap;//定义参数列表vap va_start(vap,n);//初始化参数列表 for(i=0;i 3、指针函数、函数指针
#includechar *getWord(char); char *getWord(char c) { char str[]="Dog";//str[] 局部变量 switch(c) { case 'A':return "Apple"; case 'B':return "Banana"; case 'C': return "Cat"; case 'D':return str;//报错 default: return "None"; } } int main() { char intput; printf("请输入一个字母:"); scanf("%c",&intput); printf("%sn",getWord(intput)); return 0; } #include int square(int); int square(int num) { return num*num; } int main() { int num; int (*fp)(int); printf("请输入一个整数:"); scanf("%d",&num); fp=square;//函数名就是函数地址 printf("%d*%d=%dn",num,num,(*fp)(num)); return 0; } //函数指针做参数 #include int add(int,int); int sub(int,int); int calc(int (*)(int,int),int,int);//三个参数,第一个参数为指针,指针指向函数【即 第一个参数为新定义的函数名】 // 指向的函数有两个整形参数 返回值类型为整型 int add(int num1,int num2) { return num1+num2; } int sub(int num1,int num2) { return num1-num2; } int calc(int (*fp)(int,int),int num1,int num2) { return (*fp)(num1,num2); } int main() { printf("3+5=%dn",calc(add,3,5)); printf("3-5=%dn",calc(sub,3,5)); return 0; } == //函数指针做返回值 #include int add(int,int); int sub(int,int); int calc(int (*)(int,int),int,int); int (*select(char))(int,int);//函数名select,参数为char类型,返回值类型为指针,指针指向得是(int,int)的函数 //即:指针指向的是有两个整形参数的函数 int add(int num1,int num2) { return num1+num2; } int sub(int num1,int num2) { return num1-num2; } int calc(int (*fp)(int,int),int num1,int num2) { return (*fp)(num1,num2); } int (*select(char op))(int,int) { switch(op) { case '+':return add; case '-':return sub; } } int main() { int num1,num2; char op; int (*fp)(int,int);//定义函数指针fp来接收 printf("请输入一个式子 如(1+2):"); scanf("%d%c%d",&num1,&op,&num2); fp=select(op); printf("%d%c%d=%dn",num1,op,num2,calc(fp,num1,num2)); return 0; } 4、作用域、全局变量、extern、声明与定义
#includeint main() { int i=520; printf("before:i=%dn",i); for(int i;i<10;i++)//这里的i,仅限于for语句里使用。 { printf("%dn",i); } printf("after:i=%dn",i); return 0; } [wlp@192 class_2]$ gcc -std=c99 test5.c && ./a.out//执行选项指定c99 before:i=520 0 1 2 3 4 5 6 7 8 9 after:i=520 #include void a(); void b(); void c(); int count=0;//不写默认为0 void a() { count++; } void b() { count++; } void c() { count++; } int main() { a(); b(); c(); printf("%dn",count);//3 return 0; } == #include void func(); int a,b=520;//这里全局变量a,b,a默认为0 void func()//函数里是进行局部变量操作 { int b; a=880; b=120; printf("in func(),a=%d,b=%dn",a,b); } int main() { printf("in main(),a=%d,b=%dn",a,b); func(); printf("in main(),a=%d,b=%dn",a,b); return 0; } [wlp@192 class_2]$ gcc test5.c && ./a.out in main(),a=0,b=520 in func(),a=880,b=120//这里改动的b为局部变量,并没有改变b的全局变量; //不过因为全局变量a没有赋值,虽然有默认值,但这里第一次修改a的局部变量,便看做为a的全局变量。 in main(),a=880,b=520//这里输出的是全局变量a,b #include void func(); void func() { extern count; count++; } int count=0; int main() { func(); printf("%dn",count); return 0; } [wlp@192 class_2]$ gcc test5.c && ./a.out 1 == #include int main(void) { int i=100;//i1 { int i=110;//i2 { int i=120;//i3 printf("i=%dn",i); } { printf("i=%dn",i); int i=130;//i4 printf("i=%dn",i); } printf("i=%dn",i); } printf("i=%dn",i); return 0; } [wlp@192 class_2]$ gcc test5.c && ./a.out i=120 i=110 i=130 i=110 i=100 5、生存期、存储类型、递归
#includevoid func(void); void func(void) { static int count=0;//作用域没变,但存储位置,生存期改变。 printf("count=%dn",count); count++; } int main() { //count++;//报错,因为作用域没变 int i; for(i=0;i<10;i++) { func(); } return 0; } == #include int f(int a) { auto int b=0; static int c=3; b=b+1; c=c+1; return (a+b+c); } void main() { int a=2,i; for(i=0;i<3;i++) { printf("%dn",f(a));//7,8,9 } } //输入两个数,求出3*第一个数和,一个数的另一个数次方 文件1 #include int A; void main() { int power(int); int b=3,c,result,m; printf("前请输入A的值和他的平方数:n"); scanf("%d %d",&A,&m); c=A*b; printf("%d*%d=%dn",A,b,c);//结果c d=power(m); printf("%d^%d=%dn",A,m,result);//结果result } 文件2 #include extern A;//声明一个已定义的外部变量 int power(int n) { int i,y=1; for(i=1;i<=n;i++) { y*=A; } return y; } //求阶乘 #include long fact(int num); long fact(int num) { long result; for(result=1;num>1;num--) { result*=num; } return result; } int main(void) { int num; printf("请输入一个正整数:"); scanf("%d",&num); printf("%d的阶乘是:%dn",num,fact(num)); return 0; } == #include long fact(int num); long fact(int num) { long result; if(num>0) { result=num*fact(num-1); } else //结束条件 { result=1; } return result; } int main(void) { int num; printf("请输入一个正整数:"); scanf("%d",&num); printf("%d的阶乘是:%dn",num,fact(num)); return 0; } //汉诺塔游戏 #include void hanoi(int n,char x,char y,char z); void hanoi(int n,char x,char y,char z) { if(n==1) { printf("%c-->%cn",x,y); } else { hanoi(n-1,x,z,y); printf("%c-->%cn",x,z); hanoi(n-1,y,x,z); } } int main(void) { int n; printf("输入汉诺塔层数:"); scanf("%d",&n); hanoi(n,'X','Y','Z'); return 0; } 6、完整函数执行
//定义一个字符串,将想要删除的字符输入,并打印字符串 文件1//主文件 #includevoid main { //声明在其他文件定义的函数 extern void enter_string(char str[]); void delete_string(char str[],char ch); void print_string(char str[]); char c; char str[80]; //调用其他文件的函数 enter_string(str); scanf("%c",&c); delete_string(str,c); print_string(str); } 文件2//向数组输入字符串 #include void enter_string(char str[80]) { gets(str); } 文件3//将余下数组元素复制 #include void delete_string(char str[],char ch) { int i,j; for(i=j=0;str[i]!=' ';i++) { if(str[i]!=ch) { str[j++]=str[i]; } } str[j]=' '; } 文件4 #include void printf_string(char str[]) { printf("%sn",str); } C语言基础语法【1】_z输关的博客-CSDN博客
C语言基础语法【2】_z输关的博客-CSDN博客



