关于二维数组和二级指针的理解

可以参考《C语言专家编程》的第10章
、首先指针和数组有着密不可分的联系,指针变量可以当做数组来用,在用之前,应该先让指针指向一个数据块,   这个数据块                 
可以是程序中的 某一个变量,
int a;
int *p = &a
int a;
int *p;
p = &a;
也可以是 某一个数组
int a[3];
int *p = a;//此时a就是地址
int a[3];
int *p;
p = a;

还可以是一个新开辟的内存空间
int *p;
p = (int *)malloc(sizeof(int));
其实一级指针没有什么好说的,但是级数越高程序就越不好理解。
接下来就是二级指针和二维数组的传递关系
若char **p, a[3][2];
是否p = a;
以前我一直认为 a[]是一级指针,a[][]就是二级指针,到底还是自己写程序太少。
接下来就用程序说话
#include <stdio.h>
#include <stdlib.h>

void tmp(int **aa)
{
    aa[0][0] = 10;
}

int main()
{
    int aa[3][2] = { 0 };
    tmp(aa);
    printf("%d\n", aa[0][0]);
    system("pause");
    return 0;
}
GCC上编译后出现
error: cannot convert 'int (*)[2]' to 'int**' for argument '1' to 'void tmp(int**)'
于是在翻阅网上的各种资料后发现《C语言专家编程》10.5节上有了明确的答案,
比较正常的传递多维数组的方法有3中(还有一种太复杂,想了解的可以看书)
my_function(int my_array[10][20]);

my_function(int my_array[][20]);
my_function(int (*my_array)[20]);//数组指针
my_function(int **my_array);

数组和指针参数是如何被编辑器修改的:
"数组名被改写成一个指针参数"规则并不是递归定义的。数组的数组会被改写“ 成数组的指针 ”,而不是“指针的指针”
[]的优先级高于*
                                                实参                                         所匹配的形参
数组的数组                       char c[8][10];                   char(*c)[10]     数组指针
指针数组                            char *c[15];                    char **c;              指针的指针
数组指针(行指针)   char (*c)[64];                   char (*c)[64];    不改变
指针的指针                      char **c;                            char **c;              不改变


#include <stdio.h>
#include <stdlib.h>
void tmp(int (*aa)[2])//二维数组变成了数组指针
{
    for(int i = 0; i < 6; i++)
        for(int j = 0; j < 2; j++)
            aa[i][j] = i + j + 10;
}
int main()
{
    int aa[3][2] = { {1, 2}, {3, 4}, {5, 6} };
    tmp(aa);
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 2; j++)
            printf("aa[%d][%d] = %d\n", i, j, aa[i][j]);
    system("pause");
    return 0;
}
还有一个也是我经常使用的,但是它不是二维数组与指针之间的转化,而是用到了 数组的内存是线性连续的
#include <stdio.h>
#include <stdlib.h>
void tmp(int aa[])
{
    for(int i = 0; i < 6; i++)
        aa[i] = i;
}
int main()
{
    int aa[3][2] = { 0 };
    tmp(*aa);//将aa[3]的地址传入
    for(int i = 0; i <3; i++)
        for(int j = 0; j < 2; j++)
            printf("aa[%d][%d] = %d\n", i, j, aa[i][j]);
    system("pause");
    return 0;
}
通过VS的调试工具






可以看到虽然aa[3][2]的初始化都为0,但是当调用tmp(aa);子函数值还是被改变了,所以可以看到数组的内存是连续的



  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值