zoukankan      html  css  js  c++  java
  • 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的别名,对别名进行修改,相当于对原始对象的修改。(应用于函数,在形参中反向修改实参?)

  • 相关阅读:
    HDU 5313 bitset优化背包
    bzoj 2595 斯坦纳树
    COJ 1287 求匹配串在模式串中出现的次数
    HDU 5381 The sum of gcd
    POJ 1739
    HDU 3377 插头dp
    HDU 1693 二进制表示的简单插头dp
    HDU 5353
    URAL 1519 基础插头DP
    UVA 10294 等价类计数
  • 原文地址:https://www.cnblogs.com/liujiaxin2018/p/14827636.html
Copyright © 2011-2022 走看看