C语言中的函数和指针

一、函数

1、函数的作用

通常用来完成特定功能的一段代码,把这段代码放在一起,形成一个函数。

2、函数的分类

(1)系统函数

        操作系统给我们写好的,用的话直接调用就可以。

        一些常见的系统函数:printf();  scanf();  rand();  strlen();  strcat();

(2)自定义函数

尽量函数名就能表达书函数的功能;

函数尽量有注释,函数的功能,函数的返回值类型,函数的参数。

3、函数的定义和调用

1、函数的定义

定义在函数中的变量为局部变量,定义在函数外面的变量为全局变量。

无返回值  :void   函数名(形参数据类型 形参名)

有返回值:返回值数据类型  函数名(形参数据类型 形参名)

#include
//函数的定义
//无返回值
void fan()   //void就是表示无返回值  fan是函数名
{
    //函数功能的实现
}
//有返回值
int fun()//定义了一个返回值为整型的函数,函数名为fun
{
    //函数功能实现
}

int main()
{

    return 0;
}

定义函数名的要求:

1)函数名不能以数字开头;

2)函数名中不能含有除_的特殊字符

3)函数名尽量表达清楚函数功能及含义

2、函数的调用

1)函数必须调用才执行,不调用的函数就像没有写一样

2)使用函数前需要先声明函数再使用

3、函数的调用语法

函数名();

函数调用后先跳转到函数执行,执行后再跳转到调用处

示例:输入两个数,求两个数的和,写一个两个数的加法函数,并调用,再主函数中输出;

#include

int add(int x,int y)//定义了一个返回值类型整形的函数,函数名为add
{
   int sum=x+y;    //实现计算两个数的和
   return sum; 

}

int main()
{
    int a=0,b=0;        //定义两个整型变量
    scanf("%d%d",&a,&b);//输入两个整数
    
    printf("%d",add(a,b));//调用函数add()

    return 0;
}

4、 带参函数

        主调函数将实参传递给被调函数的形参,实参与形参的类型要一致,个数也要一致。

        实参:主调函数要传递被调函数的数据,实参可以是常量也可以的是变量,实参的数量和数据类型要一一对应。

        形参:再被调函数中定义的定义的变量 , 每一个变量都必须是自己的数据类型,每个形参之间用逗号隔开,形参的作用域只在它所在的函数

        形参与实参之间是值传递。

       示例:写一个求一个数的n次方的函数,主函数输入 2   3   求2的3次方,在主函数中输出

#include

int fun(int x,int y)//定义了返回值类型为整型的函数,函数名为fun,定义了两个整形的形参变量
{
    //实现x的y次方的运算
    int i=0,sum=1;
    for(i=0;i

函数使用时注意:

调用时参数的个数与类型必须与定义一致

返回值必须预定义一致

return 的使用:

结束函数

return ;结束所在函数,可以和void函数搭配使用

return 值;结束函数的同时返回值,只要函数不是void函数就一定要写return,

//参数是主调函数传递给被调函数的值

//返回值是被调函数传递给主调函数的值

练习:主函数输入圆的半径,分别写两个函数,计算其面积,周长,并主函数输出,π用宏常量

#include
#define pi 3.14     //定义宏常量  全局使用
//声明函数,定义在主调函数后面的函数调时
//需要主调函数前面先先声明
float S(int r);
float L(int r);

int main()
{
    int r=0;
    scanf("%d",&r);
    //调用函数
    printf("面积为:%.2f,周长为:%.2f\n",S(r),L(r));

    return 0;
}
float S(int r)    //实现求圆的面积的函数
{
    return pi*r*r;

}
float L(int r)     //求圆的周长的函数
{
    return 2*pi*r;

}

二、指针

指针又称指针变量,指针变量视为一个变量,是存放地址的变量。

1、指针的定义

int *p;  //定义了一个整型指针变量,指针变量名为p 

//可以是int,char,float等

2、指针初始化

int *p=&a;//指针的初始化就是给指针一个初始地址

3、如何通过指针变量p来访问变量a

#include
int main()
{
	int a=10;
	int * p;  //定义指针变量,* 定义指针变量
    //给指针变量赋值
    p=&a; //& 取地址运算符
    //输出变量a的值
    printf("a is %d\n",a);
    //p已经存放了a的地址,通过p输出a的值
    printf("*p is %d\n",*p); //*  取内容,通过p里面存放的地址(a的地址),找到a,获取a的值  *p  -->a
	return 0;
}

4、C语言中有两种赋值方法

(1)直接赋值

        a=0;//直接给变量赋值

(2)间接赋值

        通过变量的地址进行赋值。

        int a;

        int *p = &a;

        *p = 20;         //分为两步1 取出p的值,就是a的地址 2 到那个地址去赋值(20)

示例:

#include
int main()
{
	int a=10;
	int * p;  //定义指针变量,* 定义指针变量
    //给指针变量赋值
    p=&a; //& 取地址运算符
    //直接赋值
    a=20;
    //间接赋值
    *p=30; //分为两步1  取出p的值,就是a的地址   2  到那个地址去赋值(30)  a-->30  实际上是改变了a的值
    
    //输出变量a的值
    printf("a is %d\n",a);
    //p已经存放了a的地址,通过p输出a的值
    printf("*p is %d\n",*p); //*  取内容,通过p里面存放的地址(a的地址),找到a,获取a的值  *p  -->a
	return 0;
}

5、指针和数组

#include
int main()
{
    int a[5]={10,20,30,40,50};
	//指针变量,存放数组a的地址
	int *p=a;  //数组名就是数组的首地址
    printf("p is %p\n",p); //输出p的值  0x1100
    printf("a is %p\n",a); //数组名就是数组的首地址
    printf("&a[0] is %p\n",&a[0]); //数组第一个元素的地址
    //输出a[0]的值
    printf("a[0] is %d\n",a[0]);
    printf("*p is %d\n",*p);
    
    //输出a[1]的地址
    printf("&a[1] is %p\n",&a[1]);
    printf("p+1 is %p\n",p+1); // ? +sizeof(int) 1104 
    
    //输出a[1]的值
    printf("a[1] is %d\n",a[1]);
    printf("*(p+1) is %d\n",*(p+1));
    return 0;
    
}

通过指针遍历数组

#include
int main()
{
    int a[5]={10,20,30,40,50};
    int *p=a; 
    int i=0;
    //通过指针遍历数组
    printf("p is %p\n",p);
    for(i=0;i<5;i++)
    {
        printf("%d\n",*(p+i));
    }
    printf("p is %p\n",p);
	return 0;
}

运算规则

运算规则:*(地址+整数)
地址+整数 得到一个 新的地址

地址+1   ==》 +sizeof(数据类型)

char *q;
q+1  ==>? +1 sizeof(char);

6、指针和函数

写一函数my_strlen,求一个字符串的长度, 要求: 不可以调用系统库函数strlen

#include
int my_strlen(char *p)
{
    //p 字符串的首地址  *p ---》'\0'  'h' --> '\0'
    int count=0,i=0;
    while(*(p+i)!='\0')
    {
        count++;
        i++;
    }
    
    return count;
    
}
int main()
{
    char a[100];
    scanf("%s",a); //hello
    int t=my_strlen(a);
    printf("%d\n",t);
	return 0;
}

指针的常见用法之一:在被调函数中给主调函数中的变量赋值。

指针的常见用法之一:将数组作为实参传给被调函数。

数组作为函数的参数,一般传递两个参数。目的是为了在被调函数中操作主调函数中定义的数组。

1是 数组的首地址,2是 数组的长度。

你可能感兴趣的:(c语言,开发语言,笔记,学习)