C_函数与指针

函数与指针

1函数的概念

函数:具有特定功能的程序段,C语言程序是有函数来组成的

 定义函数的目的:将一段特定的功能封装起来,为了方便使用

定义函数的规则:单一性(为了代码的可扩展性)

 例如:

 左移,右移,上移,下移,开炮

 把功能都写在main函数的弊端

 1.重复代码特别多,又长又臭

 2.如果功能发生变化,会修改很多地方

 函数的基本格式:

 返回值类型函数名字(形参列表)

 {

    函数体;

    功能代码;

}

#include <stdio.h>

/左移的功能

int left()

{ // 左移

    printf("方向盘向左移\n");

 }

int main()

{

    left(); //调用函数

    return0;

}

 

1.    函数的使用

 

函数的基本格式:

 返回值类型函数名字(形参列表)

 {

     函数体;

     功能代码;

 }

 

 定义函数有三个确定:

 1.确定函数名称

//根据函数的功能来确定,见文知意

//规范:26个字母,数字,下划线组成

//不能以数字开头

 

 2.确定形参列表

//(形参类型行参名称),根据用户调用函数的时候,是否需要传入一些补助的值来确定的

 

 3.确定返回值类型

//根据函数执行完,是否需要返回给函数的调用者

 

 定义函数的时候,写在函数名后面这个小括号里面的变量,称为形式参数,简称形参

 形参也是变量

 注意点:1.形参名称不能重复 2.函数体里面不能定义和形参名称一样的变量

 

 实参:实际参数。调用函数的时候,传入的参数,称为实参

 

 注意点:形参和实参没关系的。在函数里面改变形参的值,不会影响外面实参的值

 基本数据类型作为形参传递的时候,是值传递

 

 */

 

#include <stdio.h>

 

int getSum(int v1,int v2)

{

    int sum;//定义一个变量sum来保存和

    sum= v1 + v2;

    return sum;//需要把求的和告诉调用者

// return的作用:

//   1.结束函数 2.返回值给调用者

}

int getAverage(int a,int b)

{

//   int a;

   a  =100;

    int average = (a + b)/2;

   

    return average;

}

int main(int argc,constchar *argv[])

{

//   argc:系统传递进来的参数的个数

//   argv:参数的实际内容

    printf("argc = %d\n", argc);

    printf("argv = %s\n", argv[0]);

    printf("argv = %s\n", argv[1]);

   int result = getSum(10, 20);

   int result = getAverage(20, 40);//20 40是我们的实参

   int num1 = 10;

   int num2 = 30;

   int result = getAverage(num1, num2);调用函数,计算平均值

   printf("num1 = %d\n", num1);

//   printf("result = %d\n", result)

    return0;//程序正常结束就可以

}

 

2指针

1.  指针的基本概念

//基本数据类型作为函数参数传递的时候,是值传递

//要想在函数内部改变一个函数外部的值,需要传递一个地址

/*

 &取地址符

 &num取得num的地址(地址就是一个16进制的数字,类似门牌号)

 *   int* p;

 1.当声明变量的时候,*没有任何意义,只是表示声明的这个变量是一个指针变量

 

 2.当指针变量声明完了,再对指针变量前面取*,就代表要访问指针变量存储的地址所在的那块内存空间

   *干了两件事:

     2.1.通过pointer里面保存的地址,找到它指向的这一块内存空间

     2.2.取出这块内存空间里面的值

 */

#include <stdio.h>

   void change(int * number)//number = &val;

{

    *number =10;

}

int main(int argc,constchar * argv[])

{

    int val =55;

    printf("val = %d\n", val);

    change(&val);//&取地址符ffc1

    printf("val = %d\n", val);

   

    int num;

    num =10;

    printf("num = %d\n", num);

    num =55;

   

    int * p;

    p = &num;//p里面存的是num的地址

    printf("*p = %d\n", *p); //*p 就相当于num

    *p =66;

    /*

     如果要传递一个地址,我们需要用一个指针变量来接收

     基本数据类型的时候,怎么样来声明一个变量

     数据类型变量名

     int num;

     声明一个指针变量:

     数据类型 *指针变量名

     int * pointer;

   

     指针也是一个数据类型,指针使用来保存地址

     注意:指针占用8个字节

     */

    /*

    int num; //num用来保存整型数据

    num = 10;

    // 0000 0000 0000 0000 0000 0000 0000 1010

   

    int * pointer;//指针是用来保存地址

   

    //把地址这个数值ffc13转换成2进制

    pointer = &num; //取得num的地址,然后赋值给pointer

   

    //一个指针如果保存了一个变量的地址,我们就说这个指针指向这个变量

    //   指针就是一个地址簿,只能保存一个地址

   

    printf("num = %d\n", num);

    *pointer = 55;

    // *干了两件事:

    //   1.通过pointer里面保存的地址,找到它指向的这一块内存空间

     //   2.取出这块内存空间里面的值

   

     //   printf("num = %d\n", num);

      //   num = 55;

          printf("num = %d\n", num);

         */

   

        return0;

     }

2.    指针与字符串

 

    1.

     //    char name[4] = "lty";

     30;//常量

     "hello";//字符串常量

    

     char b = 'a';

     char *c = &b;//把变量b的地址取出来,赋值给c(c是一个指针变量)

    

     char name1[] = {'l', 't', 'y', '\0'};

     char name2[] = "lty";

     //   printf("%p\n", name2);

    

     "lty";//一个数组,这个数组的名字就是 "lty"

     //   printf("%p\n", "lty");

     //   printf("%p\n", &"lty"[0]);

    

     //字符串的特点 \0

     char *name = "lty";//把字符数组的首地址赋值给了一个指针变量

     char name4[] = "lty";

        //   printf("name4 = %s\n", name4);

        printf("name = %s\n", name);

    

     name4[1]= 'M';

     //   printf("name4 = %s\n", name4);

    

     //   name[1] = 'M';

     printf("name = %s\n", name);

    

     // 数组保存的字符串是可变的字符串,放在栈里

        //  char*保存的,是不可变,放在常量区

    

     */

     2.

     //   总结一下

     //   定义字符串的方式

     //   1.利用数组

     //   char name[10] = "lee";

     //   特点:里面的内容是可以更改的

     //   应用场景:当字符串的内容需要经常修改的时候,用数组来保存

     //   2.利用指针

     //   特点:里面的内容不能更改,一旦赋值,就不能更改

     //   char *name = "lee";

     //   应用场景:可以优化内存,当字符串不需要经常修改的时候

     //   需要999个字符串999个字符串都是一样的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值