栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言基础语法【3】

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言基础语法【3】

目录

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博客

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/850395.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号