在C语言当中必须掌握的知识,随机数,函数以及指针的定义和应用
1.随机数
随机数的产生
在C语言中,一般使用头文件<stdlib.h>中的rand()函数来产生随机数,它的代码一般是:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a = rand();
printf("%d\n", a);
return 0;
}
运行结果举例:43.
多次运行发现产生的随机数相等,其实我们可以把一次产生随机数当成一次播种,而产生的随机数就是一个“种子”,每次计算机运行后产生的随机数不会变化。
重新播种
我们需要srand()来进行重新“播种”,而srand()函数需要一个unsigned int类型参数,功能是用来设置rand()产生随机数的随机种子
void srand(unsighed int seed)
在实际应用中,我们常用<time.h>中的time()函数来进行时间的运算,随着时间的进行,就会产生不同的种子,经常和for函数来运用。如:
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int i;
srand((unsigned int )time(NULL));
for (i = 0; i < 10; i++)
{
printf("%d\n", rand());
}
return 0;
}
而在实际运用中,我们需要将随机数限制在某一个区间内,那么,就需要用%取余数来将产生的随机数限制在某一空间内,如,产生二十个在(0~20)的随机数。
int i;
srand((unsigned int )time(NULL));
for (i = 0; i < 20; i++)
{
printf("%d\n", rand()%20+1);
}
注意:NULL是和0都是一样的,但是为了目的,用途和容易识别的原因,NULL用于指针和对象,0用于数值。(注意大小写)
2,函数的定义和使用
函数定义一般形式
返回值类型 函数名(函数列表)
{
代码体
return 0;
{
在函数定义过程中,main()函数中被调用的数值被称实际参数(实参)有实际数值,而在被调函数中的参数是形式参数(形参),没有实际数值,实参和形参是不同的单元,调用结束后,形参单元被释放,能够继续接收下一个实参调过去的值。
举例:
#include <stdio.h>
int main()
{
int max(int x,int y);
int a = 20, b = 10;
int c = max(a, b);
printf("%d\n", c);
return 0;
}
int max(int x, int y)
{
return x + y;
}
也可以把被调函数写在main()函数的前面,这样就不用在main()中声明。
注意:以以上的例子为例,在max函数中,x和y,已经被定义了,在max()函数中可以直接使用,不需要重复定义,而在max函数体中,也需要用到x和y这两个形参来进行计算;在main()函数中,需要调用的函数做声明时要有结束符号“;”。
多文件编辑
在编辑文件中,我们可能会使用到多文件编辑,多文件编辑中,需要在头文件中进行函数的声明,那么其他相应的函数就需要定义,然后在主函数的头文件中加入include<xxx.h>(xxx表示头文件的名字)
如:
max.h头文件
#pragma once
int max(int x, int y);
max.c调用函数
int max(int x, int y)
{
return x + y;
}
main.c主函数
#include <stdio.h>
#include"max.h"
int main()
{
int a = 20, b = 10;
int c = max(a, b);
printf("%d\n", c);
return 0;
}
在编写头文件时,我们常用
#pragma once
声明部分
和
#ifndef _SOME_H_
#DEFIME _SOME_H_
声明部分
#endif
来防止头文件重复。
指针定义和应用
我们在编写代码时,会常用到指针,而指针的定义,和其他字符类型的定义相似。
int* p
char* p
float* p
long* p
long long* p
short* p
double* p
以上都是指针类型,我们使用指针时,要将指针类型设成对应的数据类型。
在指针的使用过程中,我们会用到符号“*”和”&“,符号“*”是取值运算符,是降维度的,而“&”是取地址运算符,是升维度的,我们可以将定义的一般字符类型,如(int,char)等,当成是最低的维度常用用法,*指针变量,&变量名。
int main()
{
int* p;
int a=10;
p = &a;
printf("%p\n", p);
}
在以上代码中,我们把指针变量p当成是整形变量a的上一个维度,那么,就能理解,&是升维度,*是降维度的这一说法。
在32位操作系统下,所有指针类型都是4个字节大小
在64位操作系统下,所有指针类型都是8个字节大小
野指针
野指针是指指针变量指向一个未知的空间,野指针是存在的,而操控野指针对应的内存空间可能会出错,操作系统将0—255作为系统占用不允许访问操作。
指针变量也是变量,是变量就可以任意赋值,但是,任意数值赋值给指针变量都是没有意义的,因为这样的指针变成了野指针,而野指针指向的区域是非法内存的区域。
如:
int* p;
p=100;
这样的指针变量编译时会产生错误。
空指针
空类型就是void,自然,空类型指针就是void *
void * 可以指向任何类型对象的地址,表示这是一个指针,和地址值有关,但不知道存储在此地址上的对象的类型。
如:
int a=10;
char ch='a';
float b=1.0;
void* p1=&a;
void* p2=&ch;
void* p3=&b;
所以在取空类型指针所指向的值的时候,应将空类型指针转换为对应的指针类型
如:
void* p1;
int a1=*((int*)p1)
意思是将p1从空指针转化为int*类型,再取转化后的p1的值。
const修饰指针
const能够修饰指针类型和指针变量。
当const修饰指针变量时,指针变量不能改变,当const修饰指针类型时,指针类型不能改变。
const int* p;//const修饰指针类型,指针类型不可转变,而p指针变量能改变
int* const p1;//const修饰指针变量,指针变量不能改变,而指针类型可以
可以熟计为const修饰离他最近的变量或类型。
文章转载至