c语言基础知识(1)


一、c语言的输入输出

int num1,num3;//定义整形数num1,num3
int num2 = 10;//定义一个整形数num2,并赋值为10
scanf("%d",&num1);//1、scanf中引号中除了占位符,尽量不要写任何其他东西,否则输入时很可能会产生错误
//2、占位符只是代表从键盘输入一个数,错误写法:scanf("%d",num1),要取地址&
//3、输入比输出多了一个地址的约束
//4、当连续输入多个变量时,应该分开写
printf("num2=%d",num2);//占位符%d,代表在输出的地方占了一个坑,至于输出什么,则根据逗号后面的变量名里面的变量值
printf("请输入两个数:\n");
scanf("%d,%d",num1,num2);//scanf中除了占位符,还有其他字符的话,用户在输入数据的时候,要按照双引号中的顺序输入有效数据和其他字符
printf("%d+%d=%d\n",num1,num2,num3);//输出时,有几个占位符对应几个变量,变量之间用逗号隔开

二、新手编程没有思路怎么办?

先用汉语写出你要实现的功能,再用编程语言翻译出来

//1、变量声明
int a,b,c;
//2、提示用户输入第一个加数
printf("请输入第一个加数:\n");
//3、获取用户输入
scanf("%d",&a);
//4、提示用户输入第二个加数
printf("请输入第二个加数:\n");
//5、获取用户输入
scanf("%d",&b);
//6、计算
c = a+b;
//7、输出结果
printf("结果:%d+%d=%d\n",a,b,c);

三、选择语句与循环语句

1、选择语句结构

//if...else...
if()
{}else{}
//选择语句的嵌套
if()
{
	if()
	{}else{}
}else{}

2、循环语句结构

//while循环,小括号中的1代表执行,而0表示不执行
while(1){}
//do..while..语句,至少比while多执行一次
do{}while(1/0);//小括号中的1代表执行,而0表示不执行
//for语句
for(;;){}

四、函数

1、什么是函数

函数是一个功能模块,它把实现某个功能的代码块包含起来,并起一个函数名,供别人调用,如printf函数,如system函数。是程序运行当中包装起来的一个步骤

2、函数的定义

void delay(){}//void代表无返回值,不需要return;或者说void代表返回值的类型是无类型,return要写,只不过return后面不加变量
int dalay()
{
	return 0;//返回一个整数
}

3、函数形式参数作用域及生存期

/*1、形式参数作用域仅限该函数
2、形式参数也是一个变量,局部变量,有自己的内存空间
3、形式参数的空间生存期
a、何时申请了该空间:当函数被调用的时候,才申请了该内存空间,同时,这个空间内的数据被赋值成实际参数的值,函数调用把实际参数的值拷贝一份给形式参数
b、何时释放了该空间:函数执行结束后,该内存空间自动(回收)释放*/

void Test(int data)//data是形式参数,类似局部变量,作用域仅限该函数
{
	printf("%d",data);

}
//函数调用则在主函数里面
int main()
{
	int a=10;
	Test(a);//a称为实际参数
	return 0;

}

五、数组

1、数组的定义及访问

(1)数组是数据的集合
(2)数组的数据是同类型的,例如1-100都是整数,不能出现1 1.2 2一起
(3)数组地址是连续的

int array[100];//没有初始化的数组,仅仅申请了100个整型数的内存空间,最好要初始化:int array[100]={0};
int array2[3] = {1,2,3};//有初始化的数组,完整初始化,该数组申请了三个整型数内存空间,并赋值三个数1,2,3
int array3[100] = {1,2,3};//有初始化的数组,不完整初始化,该数组申请了100个整型数内存空间,但只赋值三个数1 2 3,放在数组的前三个位置
//如果数组中有三个元素,那么分别用下标法访问array2[0] array[1] array[3]
**//数组的中括号[]只有在定义一个数组的时候,才表示数组的大小,其余任何情况,都表示用下标来访问数组**
printf("array2的第一个元素是:",array2[0]);
printf("array2的第二个元素是:",array2[1]);
printf("array2的第三个元素是:",array2[2]);

//用for循环遍历数组
int i;
for(i=0;i<3;i++)
{
	printf("array2的第%d个元素是:%d\n",i+1,array2[i]);

}

2、计算数组的大小

/*问:如何计算数组中元素的个数?
答:数组的总大小/一个类型的大小*/
int array[6] = {1,2,3};
printf("数组的大小是:%d个\n",sizeof(array));//计算结果是24
printf("array元素个数是:%d个\n",sizeof(array)/sizeof(array[0]));
printf("array元素个数是:%d个\n",sizeof(array)/sizeof(int));//和上一句一样

3、数组传参

/*形式参数中,虽然写的是一个数组的样子,但是中括号中数组的大小时无效的
这里不管中括号中写多少,都不能代表形参数组有多大
这里的中括号仅仅用来表示该参数是一个地址*/
void arrayPrint(int datas[],int cnt)
{
	int i;
	for(i=0;i<cnt;i++)
	{
		printf("%d",datas[i]);
	}
	putchar('\n');//putchar输出一个字符  getchar()获取一个字符的输入
}

int main()
{
	int array2[3] = {1,2,3};
	arrayPrint(array2,sizeof(array2)/sizeof(array2[0]));//数组和函数结合,数组名当做实际参数
	//array2和&array2[0]都可以表示数组的首地址
	return 0;
}

六、指针(c语言的重点,也是难点)

数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量。 在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。指针变量的值就是某份数据的地址,这样的一份数据可以是数组、字符串、函数,也可以是另外的一个普通变量或指针变量。

1、定义指针变量

int a=10;//整型变量  存放的是整数
char c='c';//字符变量   存放的是字符
int array[3]={1,2,3};//数组"变量"  存放的是一串数据

//定义指针变量
int *p;//指针变量,存放的是地址
p=&a;//给指针变量赋值   *p = &a;是错误写法

/*只有在定义一个指针变量的时候,*才是指针的标识符
其他情况,都是一个运算符,跟+-/*运算符类似,该运算符的功能是取出内存地址中数据的值(取内容)*/
printf("通过地址来获取a的值",*p);//此时的*代表取内容

2、指针分类型

	int *p;//只能存放整数的地址
    char *p2;//只能存放字符数据的地址
    
    int a = 10;
    char c = 'A';
    
    p=&a;
    p2=&c;
    
    printf("a=%d\n",*p);
    printf("c=%c\n",*p2);
    
    //指针偏移++   指针++根据类型不同,偏移值也不同
    printf("a的地址:%p\n",p);
    printf("a的地址++:%p\n",++p);//int是4个字节
    printf("c的地址:%p\n",p2);
    printf("c的地址++:%p\n",++p2);//char是1个字节

在这里插入图片描述

3、指针访问数组

数组的首地址有两种表示方式:
(1)数组名=首地址
(2)第一个元素的地址:&array[0]

printf("=====普通的数组访问方式=====\n");
    int array[3]={1,2,3};
    printf("第一个元素的地址%p\n",&array[0]);
    printf("第二个元素的地址%p\n",&array[1]);
    printf("第三个元素的地址%p\n",&array[2]);
    
    printf("=====输出数组的数据:=====\n");
    int i;
    for(i=0;i<3;i++)
   {
		
        printf("%d ",array[i]);
        
        }
    
    putchar('\n');
    
    
    printf("=====指针访问数组=====\n");
    int *parray;
    parray = &array[0];
	
    printf("第一个元素的地址%p\n",parray++);
    printf("第二个元素的地址%p\n",parray++);
    printf("第三个元素的地址%p\n",parray);
    
    
    printf("=====输出数组的数据:=====\n");
    parray = &array[0];//重新赋值
    for(i=0;i<3;i++)
   {
		
        printf("%d ",*parray);
        parray++;
        }
    
    putchar('\n');

在这里插入图片描述

4、指针数组

在C语言和C++等语言中,数组元素全为指针变量的数组称为指针数组,指针数组中的元素都必须具有相同的存储类型、指向相同数据类型的指针变量。指针数组比较适合用来指向若干个字符串,使字符串处理更加方便、灵活。一维指针数组的定义形式为:“类型名 *数组标识符[数组长度]”。

	int a = 2;
    int b = 3;
    int c = 4;//三个毫无关系的整型变量
    
    int array[3];//多个整数,叫做整数数组
	
    int* parray[3];//多个指针,叫做指针数组,数组中的每一项元素都是一个指针变量
    
    parray[0] = &a;
    parray[1] = &b;
    parray[2] = &c;//三个普通的,没有任何关系的整型变量的地址存入指针数组
    
    int i;
    for(i=0;i<3;i++)        
    {
    
		printf(" %d ",*(parray[i]));
    
    
    }
		
    
    putchar('\n');

在这里插入图片描述

5、数组指针

数组的指针,是一个指针,强调的是类型,数组的个数,偏移值是偏移了整个数组的大小

	int a[3] = {1,2,3};
	
    int (*p)[3];
    p = a;
    
    int *p2;
    p2 = a;
    
    printf("数组的地址是%p\n",a);    
    printf("p数组的地址是%p\n",p);    
    printf("p2数组的地址是%p\n",p2);    
    
    
    printf("===========区别==============\n");
    printf("p++的结果是: %p\n",++p);//偏移了整个数组
    printf("p2++的结果是: %p\n",++p2);

在这里插入图片描述

6、函数指针

函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数做函数的参数

//一、如何定义一个函数指针
void (*p2)();//1、如何表示指针:*    2、如何知道是函数: ()    3、函数指针是专用的,格式要求很强(参数类型  个数  返回值),就像数组指针一样

//二、如何给函数指针赋值
p2 = add;
//三、如何通过函数指针调用函数
p2();//直接通过指针名字+()
(*p2)();//取内容  (*指针名字)()
#include <stdio.h>
#include <stdlib.h>

//定义一个函数
int add(int a,int b)
{
		return a+b;   
    }
int main()
{
int (*padd)(int a,int b);
    padd = add;
    int ret = (*padd)(1,2);
    printf("ret=%d\n",ret);
   
	system("pause");
	return 0;
}

在这里插入图片描述

七、往期文章

c语言基础知识(1)
c语言基础知识(2)
c语言基础知识(3)
c语言基础知识(4)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃秃秃秃哇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值