• 多维数组的【】和多级指针*转化推演


    1. a[i][j]<==>*(*(a+i)+j)
    2. a[i]==>a[0+i]==>*(a+i)
    3. //a[i][j]==>a[0+i][j]==>*(a+i)[j]==>*(a+i)[0+j]==>*(*(a+i)+j)
    4. //[]是从左到右进行运算的

    二.多维数组左函数参数的退化原因大剖析

    多维数组名的本质就是一个指向一维数组的指针。是个二级指针。

    1. void printArray01(int a[3][5]) //4k
    2. {
    3. int i, j, tmp;
    4. for (i = 0; i < 3; i++)
    5. {
    6. for (j = 0; j < 5; j++)
    7. {
    8. printf("%d ", a[i][j]);
    9. }
    10. }
    11. }
    12. void printArray02(int a[][5])//a是一个指向一维数组的指针 //5k
    13. {
    14. int i, j, tmp;
    15. for (i = 0; i < 3; i++)
    16. {
    17. for (j = 0; j < 5; j++)
    18. {
    19. printf("%d ", a[i][j]);
    20. }
    21. }
    22. }
    23. void printArray03(int (*b) [5])//可以把a[]变为(*a) //6k
    24. {
    25. int i, j, tmp;
    26. for (i = 0; i < 3; i++)
    27. {
    28. for (j = 0; j < 5; j++)
    29. {
    30. printf("%d ", b[i][j]);
    31. }
    32. }
    33. }
    34. //多维数组做函数参数的退化过程。。。事实存在,为什么会存在这种退化的过程?
    35. void main()
    36. {
    37. int a[3][5];
    38. int i = 0;
    39. int j = 0;
    40. int tmp = 1;
    41. for (i = 0; i < 3; i++)
    42. {
    43. for (j = 0; j < 5; j++)
    44. {
    45. a[i][j] = tmp++;
    46. }
    47. }
    48. printArray03(a);

    三.多维数组做函数参数退化总结。

    1. #include<stdlib.h>
    2. #include<string.h>
    3. #include<stdio.h>
    4. void printArray01(int *array,int size)
    5. {
    6. int i = 0;
    7. for (i = 0; i < size; i++)
    8. {
    9. printf("%d ", array[i]);
    10. }
    11. }
    12. void main()
    13. {
    14. int a[3][5];
    15. int i, j, tmp = 1;
    16. for (int i = 0; i < 3; i++)
    17. {
    18. for (int j = 0; j < 5; j++)
    19. {
    20. a[i][j] = tmp++;
    21. }
    22. }
    23. //把二维数组当做一维数组来打印,如果可以线性打印出来就可以证明其是线性存储的
    24. printArray01((int*)a,15);
    25. printf("Hello...\n");
    26. system("pause");
    27. return;
    28. }

    四.多维数组做函数参数的技术推演

    1.C语言中只会以机械式的值拷贝的方式传送参数(实参把值传给形参)

    1. int fun(char a[20],size_t b)
    2. {
    3. printf("%d\t%d",b,sizeof(a));
    4. }

    原因1:高效

    原因2:C语言处理a[n]的时候,它没有办法知道n是几,它只知道&a[0]是多少,它的值作为参数传递进去了  ;虽然C语言可以直接做到int fun(char a[20]),C++编译器选择了不作为,即函数能得到20这个数字,但是C没有这么做。

    2.二维数组参数同样存在退化的问题

    二维数组可以看做是指向一维数组的指针;

    二维数组中的每一个元素都是一维数组;

    二维数组参数中第一维的参数可以省略;

    1. void f(int a[5])==>void f(int a[]);==>void f(int* a);
    2. void g(int a[3][3])==>void g(int a[][3])==>void g(int (*a)[3]);

    3.等价关系

    数组做函数参数                                 等效的指针参数

    1. 一维数组 char a[30] 指针 char *a
    2. 指针数组 char *a[30] 指针的指针 char**a
    3. 二维数组 char a[10][30] 数组的指针 char(*a)[30]

  • 相关阅读:
    想知道对象有没有在外面搞暧昧?简单几步就能查清楚
    SparkML
    ubuntu 查询mysql的用户名和密码 ubuntu查看username
    命令执行漏洞
    安卓如何搜索到蓝牙5.0的扩展广播
    CTF中的一些图形密码
    嵌入式学习(十六)—STM32 定时器(一)PWM输出(a)
    Java I/O流概述
    都要2023年了,造机器人还能搞出什么新花活?
    除了labview你还知道哪些工业控制领域的软件?
  • 原文地址:https://blog.csdn.net/Ha_Girl/article/details/125623762