• c语言中函数的参数、对象、地址、取址运算符、指针运算符。


    1、c语言中函数的参数

    01、c语言中实参向形参的传递过程是单向传递的,在对形参进行修改后的值不能返回给实参。

    02、函数返回调用源的返回值只能有一个。

    例、求两个数的和与差。

    #include <stdio.h>
    
    void sum_diff(int x, int y, int sum, int diff)
    {
        sum = x + y;
        diff = (x > y) ? (x - y) : (y - x);    
    } 
    
    int main(void)
    {
        int a, b, wa = 0, sa = 0;
        
        puts("please input two integers.");
        printf("a = "); scanf("%d", &a);
        printf("b = "); scanf("%d", &b);
        
        sum_diff(a, b, wa, sa);  //wa,sa作为实参传递给形参sum和diff,sum和diff在调用函数时重新进行了赋值,但是并不能返回给函数的调用位置main函数中的变量。(实参→形参,单向复制) 
        // wa和sa的值仍然是在main函数中的值0.
        printf("
    wa: %d || sa: %d
    ", wa, sa);
        
        return 0;
    }

    为了解决这个问题(对传入函数中的变量的值进行修改,并返回调用源),需要c语言中的指针。

    2、对象和地址

    001、对象是不是就是变量???

    002、变量拥有多种属性:数据类型、存储期、变量名等。

    003、对象:继承了变量属性而创建的变量实体称为对象。

    004、地址:指的是对象的地址。 对象在内存上的存储位置编号。  本质:存储位置编号(指针)。

    3、取址运算符

    001、取址运算符:单目运算符 &称为取址运算符。

    002、将取址运算符放在对象(变量)的前面,就可以获得对象的地址(存储位置编号)。

    003、取址运算符&的作用是获取对象的地址,生成指向对象的指针。(与其说是获取地址,不如说是生成指针)。

    004、对象地址的转换说明为%p,其中p为pointer的首字母。

    005、取址运算符&写在Type型变量x的前面,&x为Type*型指针,其值为x的地址。

    示例程序如下:

    #include <stdio.h>
    
    int main(void)
    {
        int n;
        double x;
        int a[3];
        
        printf("nnnn:  %p
    ", &n);   //&取址运算符,获取地址,生成指向对象(n)的指针 
        printf("xxxx:  %p
    ", &x);   //%p为对象地址的转换说明,p为pointer的首字母 
        printf("a[0]:  %p
    ", &a[0]);
        printf("a[1]:  %p
    ", &a[1]);
        printf("a[2]:  %p
    ", &a[2]);
        
        return 0; 
    }

    4、指针运算符

    001、单目运算符*称为指针运算符。

    002、指针运算符的作用:1、生成指针变量,eg:int *x; 生成指针变量x,2、获取指针所指对象的值。 eg: *p,获取指针p所指对象的值。

    003、当指针p的值为对象x的地址时,说p指向x, *p为x的别名。

    程序:

    #include <stdio.h>
    
    int main(void)
    {
        int a = 100;
        int b = 200;
        int c = 500;
        
        int *x, *y;   //指针变量声明,声明x、y均为指向int型变量的指针。 
        
        x = &a; y = &c;  //生成指针,x为a的地址,x指向a,y为c的地址,y指向c。 
        
        printf("xxxx:  %d
    ", *x);  // 在指针前使用指针运算符,用于获取指针所指对象的值,x指向a,因此为a的值。 
        printf("yyyy:  %d
    ", *y);  //同理,y执行c,因此为c的值。 
        
        x = &b;  //修改指针x,x由 是a的地址改为是b的地址,因此a由指向a该为指向b。 
        *y = 800;  // 指针y是c的地址,y指向c,因此*y是c的别名,对*y重新赋值,相当于对c重新赋值。 
        puts("
    ===============
    ");
        
        printf("aaaa:  %d
    ", a);  //对象a的值 
        printf("bbbb:  %d
    ", b);  //对象b的值 
        printf("cccc:  %d
    ", c);  //对象c的值,c有c的别名*y重新进行了赋值,c此时为800. 
        printf("xxxx:  %d
    ", *x); //x此时是指向b的指针,*x因此是对象b的值 
        printf("yyyy:  %d
    ", *y); //*y作为c的别名,进行了重新赋值,值为800. 
        
        return 0;    
    } 

    指针p的值为对象x的地址时,p执行x,*p为x的别名,对别名进行修改,相当于对原始对象的修改。(应用于函数,在形参中反向修改实参?)

  • 相关阅读:
    vue插件(还真是第一次接触)
    Vue父组件向子组件传值以及data和props的区别
    Vue v-bind与v-model的区别
    vue 异步渲染
    vue动态加载不同的组件(分内部和外部组件)
    vue自定义组件的递归
    作用域插槽模板迭代的次数,取决于组件内部独立slot的数量
    说说 Vue.js 中的 v-cloak 指令
    C语言 system
    C语言 有符号、无符号
  • 原文地址:https://www.cnblogs.com/liujiaxin2018/p/14827636.html
Copyright © 2020-2023  润新知