(c笔记):函数,随机数,初见指针

函数
函数分类:
c程序是由函数组成的·,我们写的代码都是由主函数main()开始执行的。函数是c程序的基本模块,是用于完成特定任务的程序代码单元。
从函数定义的角度来看函数可分为系统函数和用户自定义函数两种:
1:系统函数,即库函数:这是由编译系统提供的,用户不必自定义这些函数,可以直接使用它们,如我们常用的 打印函数printf()。
2:用户自定函数:用以解决用户的专门需要。
函数的使用:
函数的使用可以省去重复代码的编写,降低代码重复率 冗余。
函数可以让程序更加模块化,从而有利于程序的阅读,修改和完善。
假如我们编写一个实现以下功能的程序:读入一行数字;对这些数字排序;找到它们的平均值:打印一个柱状图。如果我们把这些操作直接写在main()函数里面,这样可能会给用户感觉代码有些凌乱,但,假如我们使用函数,这样可以让程序更加清晰、模块化。
函数的调用:产生随机数
当调用函数的时候,需关心5要素
头文件:包含指定的头文件
函数名字:函数名字必须和头文件声明的名字一样
参数:需要知道此函数能做什么才调用
返回值:根据需要接收返回值
在这里插入图片描述

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
 //time_t timer=time(NULL);
 //srand((size_t)timer);
 //添加随机数种子
 srand((sizet_t)time(NULL))for(int i=0;i<100;i++)
 {
  printf("5d\n",rand()%51=50);//50~100
 }
}
return 0;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
无参数函数的调用:如果是调用无参函数,则不能加上“实参”,但括号不能省略。
实际参数列表包含多个实参,则各参数间用逗号隔开
函数返回值:如果函数定义没有返回值,函数调用时不能写void关键字,调用函数时也不能接收函数的返回值,
函数的声明:
如果使用用户自己定义的函数,而在函数与调用它的函数(即主调函数)不在同一文件中,或者
定义的位置在主调函数之后
,则必须在调用此函数之前对被调用的函数做声明。
所谓函数声明,就是在函数尚未定义的情况下,事先将该函数的有关信息通知编译系统,相当于告诉编译器,函数在后面定义,以便编译能正常进行。
注意*:*一个函数只能被定义一次,但可以声明多次。
声明和定义的区别
声明变量不需要建立存储空间,如:extern int a;
定义变量需要建立存储空间,如:int b;
广义的角度来讲声明中包含者定义,即定义是声明的一个特例,所以并非所有的声明都是定义:
int b 它既是声明又是定义
一般情况下,把建立存储空间的声明称之为”定义“,而把不需要建立存储空间的声明称之为”声明“。
主函数和exit函数

#include <stdio.h>
#include <stdlib.h>
int fun1()
{
 printf("hello world\n");
 printf("hello world\n");
 //终止程序执行
 exit(0);
 //return 0;
 printf("hello world\n");
 printf("hello world\n");
 return 0;
}
int main()
{
 fun1();
 return 0;
}
运行结果:
hello world
hello world

多文件编程
在这里插入图片描述
编程实例:
步骤:以编程软件visdual studio为例:
创建一个项目(设置为启动项目),然后创建一个空项目的源文件起名为:main.c ;然后再创建一个源文件命名为:01fun.c ;然后点击头文件创建一个头文件的项目起名为:head.h ;附图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
指针
内存
存储器:计算机的组成中用来存储程序和数据,辅助CPU进行运算处理的重要部分。
内存:内部存贮器,暂存程序/数据–掉电丢失SRAM,DRAM,DDR,DDR2,DDR3。
外存:外部存储器,长时间保存程序/数据–掉电不丢失ROM,ERROM,FLASH,(NAND,NOR)‘硬盘、光盘。
内存是沟通CPU与硬盘的桥梁:
暂存放CPU中的运算数据
暂存与硬盘等外部存储器交换的数据
和存储地址空间
物理存储器:实际存在的具体存储器芯片
主板上装的内存条
显示卡上的显示RAM芯片
各种适配卡上的RAM芯片和ROM芯片
存储地址空间:对存储器编码的范围。我们在软件上常说的内存是指这一层含义。
编码:对每个物理存储单元(一个字节)分配一个号码。
寻址:可以根据分配的号码找到相应的存储单元,完成数据的读写。
内存地址
将内存抽象成一个很大的一维字符数组。
编码就是对内存的每一个字节分配一个32位或者64位的编号(与32位或者64位处理器相关)
这个内存编号我们称之为内存地址。 内存中的每一个数据都会分配相应的地址:
如:
char:占一个字节分配一个地址
int:占4个字节分配四个地址
float,struct、函数,数组等

#include <stdio.h>
int main()
{
 int a=0xaabbccdd;
 printf("%p\n%P",&a,a);
 return 0;
}
运行(式例)结果:
000000000062FE1C
00000000AABBCCDD

指针变量的定义与使用

#include <stdio.h>
 void swap(int* pa, int* pb);//定义指针形参
int main()
{
    int a = 6, b = 5;
    swap(&a, &b);   //传递实参地址值
    printf("a=%d b=%d", a, b);//打印数据
    return 0;
}
void swap(int *pa,int *pb)//交换值
{
    int t;
    t = *pa;
    *pa = *pb;
    *pb = t;
}
运行结果:
a=5 b=6

野指针和空指针

//&是取地址符是升维度的
//*是取值符是将维度的
在这里插入图片描述

#include <stdio.h>
int main()
{
 //不建议将一个变量的值赋值给野指针
 //野指针 --》指向一个未知的空间
 int* p = 100; //程序中允许存在野指针
 //操作系统将0~255作为系统占用不允许访问操作
 //操作野指针对应的内存空间可能报错
 printf("%d\n", *p);
 return 0;
}

空指针是指内存地址为0的空间
操作空指针对应的空间一定会报错
空指针可以用作条件判断
定义空指针如:int *p=NULL;
万能指针(void指针):

#include <stdio.h>
int main()
{
 int a=10;
 void *p=&a;
 *(int *)p=100;
 printf("%d\n",a);
 printf("%d\n",*(int *)p);
 return 0;
}
运行结果:
100
100

万能指针能接收任意类型变量的内存地址
通过万能指针修改变量的值时 需要找到变量对应指针类型才可以
在这里插入图片描述此处内容结合我另一博客结合参考

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值