zoukankan      html  css  js  c++  java
  • 【C】Re07 二级指针,指针与参数

    一、二级指针:

    变量 = 内存地址 + 存储值;

    指针 = 内存地址 + 变量内存地址;

    二级指针 = 内存地址 + 指针内存地址;

    多级指针 = 内存地址 + 上一级内存地址;

    void morePointer() {
        int n = 190;
        int * pointer = &n;
        int ** pointerL2 = &pointer;
    
        printf("n -> %d
    ", n);
        printf("pointer -> %p
    ", pointer);
        printf("pointerL2 -> %p
    ", pointerL2);
    
        printf("*pointerL2 == pointer == &n ? -> %d (1 true 0 false), *pointerL2 -> %p
    ", *pointerL2 == pointer, *pointerL2);
        printf("**pointerL2 == *pointer == n ? -> %d (1 true 0 false), **pointerL2 -> %d
    ", **pointerL2 == n, **pointerL2);
    }
    
    int main() {
        morePointer();
        return 0;
    }

     二、参数传递

    数据传递方式:

    1、值传递

    2、地址传递

    // 使用值传递
    void valueSwap(int n1, int n2) {
        int temp = n1;
        n1 = n2;
        n2 = temp;
    
        printf("in function valueSwap n1 = %d, n2 = %d
    ", n1, n2);
    }
    
    // 使用地址传递
    void addrSwap (int * n1, int * n2) {
        int temp = *n1;
        *n1 = *n2;
        *n2 = temp;
        printf("in function addrSwap a = %d, b = %d
    ", *n1, *n2);
    }
    
    void testForSwap() {
        int a = 200;
        int b = 100;
        valueSwap(a, b);
        printf("in function testForSwap a = %d, b = %d
    ", a, b);
    
        addrSwap(&a, &b);
        printf("in function testForSwap a = %d, b = %d
    ", a, b);
    }
    
    int main() {
        testForSwap();
        return 0;
    }

    三、数组名作为函数参数

    一个需求,定义一个函数用来遍历传递进来的数组

    void printArray(int * arr, int size) { // 使用指针,允许是变量地址,但也可以是数组名称
        for (int i = 0; i < size; ++i) {
            printf("element -> (%d), and mem-addr -> %p
    ", arr[i], &arr[i]);
        }
    
        printf("sizeof is pointer or array itself ? -> %d
    ", sizeof(arr));
    }
    
    // 为了明确参数传递的是什么数据,建议是数组就传递数组
    void printArrayV2(int array[], int length) {
        for (int i = 0; i < length; ++i) {
            printf("element -> (%d), and mem-addr -> %p
    ", array[i], &array[i]);
        }
    
        printf("sizeof is pointer or array itself ? -> %d
    ", sizeof(array));
    }
    
    // 封装获取数组长度的方法
    int getSize(int array[]) {
        return sizeof(array) / sizeof(int);
    }
    
    // 封装数组遍历的方法:
    void printArrayV3(int array[]) {
        for (int i = 0; i < getSize(array) ; ++i) {
            printf("el -> %d, mem-addr -> %p
    ", array[i], &array[i]);
        }
        printf("sizeof is pointer or array itself ? -> %d
    ", sizeof(array));
    }
    
    int main() {
        int array[10] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20};
        printArray(array, 10);
    
        printf("sizeof is pointer or array itself ? -> %d
    ", sizeof(array));
    
        int array2[9] = { 2 };
        printArrayV2(array2, sizeof(array2) / sizeof(int));
        printf("sizeof is pointer or array itself ? -> %d
    ", sizeof(array2));
    
        int array3[3] = { 100 };
        printArrayV3(array3);
        printf("sizeof is pointer or array itself ? -> %d
    ", sizeof(array3));
        return 0;
    }

     四、指针做函数的返回类型

    // 定义一个全局变量
    int g_a = 100;
    
    int * returnTypeUsage() {
        int a = 100; // 定义局部变量
    
        {
            int a = 100; // 代码块中的局部变量
    
            {
                int a = 100; // 块中块的局部变量
            }
        }
    }
    
    // 封装一个获取地址的函数
    int* getMemAddr() {
        return &g_a;
    }
    
    int main() {
        int *p = getMemAddr();
    
        *p = 33000;
    
        printf("g_a -> %d
    ", g_a);
        return 0;
    }
  • 相关阅读:
    UVA 10600 ACM Contest and Blackout(次小生成树)
    UVA 10369
    UVA Live 6437 Power Plant 最小生成树
    UVA 1151 Buy or Build MST(最小生成树)
    UVA 1395 Slim Span 最小生成树
    POJ 1679 The Unique MST 次小生成树
    POJ 1789 Truck History 最小生成树
    POJ 1258 Agri-Net 最小生成树
    ubuntu 用法
    ubuntu 搭建ftp服务器,可以通过浏览器访问,filezilla上传文件等功能
  • 原文地址:https://www.cnblogs.com/mindzone/p/13948653.html
Copyright © 2011-2022 走看看