鱼C论坛

 找回密码
 立即注册
查看: 1054|回复: 7

[已解决]二级指针和二维数组的问题 小白求助

[复制链接]
发表于 2020-3-7 12:33:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
多维数组名的本质是一个数组指针。
int a[3][5]

第i行首元素地址和整个第i行的地址是重叠的
a+i              二级指针  整个第i行的地址
*(a+i)    一级指针  第i行的首元素地址
*(a+i)+j  第i行第j列的地址 相当于&a[i][j]


问题为啥a+i是二级指针 ?   为啥*(a+i)是一级指针? 为啥*(a+i)+j代表第i行第j列的地址?
为啥二维数组名a 相当于函数指针int(*p)[5]   ?
最佳答案
2020-3-7 14:55:45
不知道理解的对不对
二维数组名a存放数组首元素的地址  为&a[0]             a+i等效于&a[i]
*(a+i)的值为a[i]  a[i]存放于值为&a[i][0]   *a[i]就能打出每行首位元素的值   所以a+i为二级指针

*(a+i)+j相当于&a[i][j]     

函数指针int(*p)[5] 指向包括5个元素的一维数组的变量  p常用于接收数组名a或第一个元素的地址 &a[0]
p的值就是该一维数组的起始地址 *p数组包括 (*P)[0],(*P)[1]等,作用效果跟二维数组名差不多

因为a+i和&a[i]指向行,对其加减时,作用范围为一行(跨越一行的元素)的加减
      *(a+i)和a[i]指向列,对其加减时,作用范围为一列(跨越一个元素)的加减,所以*(a+i)+j代表第i行第j列的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-7 12:36:15 | 显示全部楼层
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

void main()
{
        int i;
        int j;
        int tmp = 1;
        int a[3][5];
        {
                int(*pArr)[5];
                pArr = a;
                for (i = 0; i < 3; i++)
                {
                        for (j = 0; j < 5; j++)
                        {
                                pArr[i][j] = tmp++;
                        }
                }
                for (i = 0; i < 3; i++)
                {
                        for (j = 0; j < 5; j++)
                        {
                                printf("%d ",pArr[i][j]);
                        }
                }
                printf("\n");
        }
        system("pause");
}

问题2 :这个pArr是几级指针?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-7 13:17:53 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-7 14:47:20 | 显示全部楼层
一、a相当于&a[0][0],而 a + i = &a[i][0];
二、* (a + i) = 是存放 i 行的首地址的值,也是个地址;
三、* (a + i) + j 同(一)一样
四、一维数组可以使用*p代替
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-7 14:55:45 | 显示全部楼层    本楼为最佳答案   
不知道理解的对不对
二维数组名a存放数组首元素的地址  为&a[0]             a+i等效于&a[i]
*(a+i)的值为a[i]  a[i]存放于值为&a[i][0]   *a[i]就能打出每行首位元素的值   所以a+i为二级指针

*(a+i)+j相当于&a[i][j]     

函数指针int(*p)[5] 指向包括5个元素的一维数组的变量  p常用于接收数组名a或第一个元素的地址 &a[0]
p的值就是该一维数组的起始地址 *p数组包括 (*P)[0],(*P)[1]等,作用效果跟二维数组名差不多

因为a+i和&a[i]指向行,对其加减时,作用范围为一行(跨越一行的元素)的加减
      *(a+i)和a[i]指向列,对其加减时,作用范围为一列(跨越一个元素)的加减,所以*(a+i)+j代表第i行第j列的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-7 16:17:34 | 显示全部楼层
问题为啥a+i是二级指针 ?   

你定义 int a[3][5],a是几级指针?指针的+-不改变它的级数。

为啥*(a+i)是一级指针?

这个必须要完成第一个提问,如果a是一个二级指针,你已经认可了,那么*a是不是取a指针存储的值(其实这个值还是一个内存地址,也是一个指针,当然,是一级指针),

为啥*(a+i)+j代表第i行第j列的地址?

这个问题得基于上一个问题,既然 *(a+i)是一个一级指针,一级指针偏移 j个位置,它所存储的不还是一个地址吗?至于 第i行第j列 还不是你的设定的

为啥二维数组名a 相当于函数指针int(*p)[5]   ?

*p能不能代表一个数组,类似*p={1,2,3},如果你能理解这个感觉,那么 5个{1,2,3}组成的数组是什么样子?不就是数组里有数组,不是二维数组吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-7 20:02:52 | 显示全部楼层
4goodworld 发表于 2020-3-7 16:17
问题为啥a+i是二级指针 ?   

你定义 int a[3][5],a是几级指针?指针的+-不改变它的级数。

谢谢大佬了 我看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-8 10:59:12 | 显示全部楼层
4goodworld 发表于 2020-3-7 16:17
问题为啥a+i是二级指针 ?   

你定义 int a[3][5],a是几级指针?指针的+-不改变它的级数。
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

void getStr(char* myp, char c, char  buf[10][20])  //问题 为啥这里char*myp 用一级指针?啥时候用二级的?
{
        int i;
        if (myp == NULL)
        {
                return;
        }
        int count = 0;
        int e = 0;
        for (i = 0; myp[i]; i++)
        {
                if (myp[i] != c)
                {
                        buf[count][e++] = myp[i];
                        buf[count][e] = '\0';
                }
                else
                {
                        count++;
                        e = 0;
                }
        }

}

void main()
{
        int i;
        int j;
        char* p = "abcdef,acccd,eeee,aaaa,e3eeeee,sssss";
        char c = ',';
        char buf[10][20];
        getStr(p, c, buf);
        for (i = 0; i < 6; ++i)
        {
                printf("%s\n", buf[i]);
        }
        system("pause");
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 00:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表