鱼C论坛

 找回密码
 立即注册
查看: 1310|回复: 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列的地址
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

  5. void main()
  6. {
  7.         int i;
  8.         int j;
  9.         int tmp = 1;
  10.         int a[3][5];
  11.         {
  12.                 int(*pArr)[5];
  13.                 pArr = a;
  14.                 for (i = 0; i < 3; i++)
  15.                 {
  16.                         for (j = 0; j < 5; j++)
  17.                         {
  18.                                 pArr[i][j] = tmp++;
  19.                         }
  20.                 }
  21.                 for (i = 0; i < 3; i++)
  22.                 {
  23.                         for (j = 0; j < 5; j++)
  24.                         {
  25.                                 printf("%d ",pArr[i][j]);
  26.                         }
  27.                 }
  28.                 printf("\n");
  29.         }
  30.         system("pause");
  31. }
复制代码


问题2 :这个pArr是几级指针?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-7 13:17:53 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-7 14:47:20 | 显示全部楼层
一、a相当于&a[0][0],而 a + i = &a[i][0];
二、* (a + i) = 是存放 i 行的首地址的值,也是个地址;
三、* (a + i) + j 同(一)一样
四、一维数组可以使用*p代替
小甲鱼最新课程 -> https://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列的地址
小甲鱼最新课程 -> https://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}组成的数组是什么样子?不就是数组里有数组,不是二维数组吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

谢谢大佬了 我看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  5. void getStr(char* myp, char c, char  buf[10][20])  //问题 为啥这里char*myp 用一级指针?啥时候用二级的?
  6. {
  7.         int i;
  8.         if (myp == NULL)
  9.         {
  10.                 return;
  11.         }
  12.         int count = 0;
  13.         int e = 0;
  14.         for (i = 0; myp[i]; i++)
  15.         {
  16.                 if (myp[i] != c)
  17.                 {
  18.                         buf[count][e++] = myp[i];
  19.                         buf[count][e] = '\0';
  20.                 }
  21.                 else
  22.                 {
  23.                         count++;
  24.                         e = 0;
  25.                 }
  26.         }

  27. }

  28. void main()
  29. {
  30.         int i;
  31.         int j;
  32.         char* p = "abcdef,acccd,eeee,aaaa,e3eeeee,sssss";
  33.         char c = ',';
  34.         char buf[10][20];
  35.         getStr(p, c, buf);
  36.         for (i = 0; i < 6; ++i)
  37.         {
  38.                 printf("%s\n", buf[i]);
  39.         }
  40.         system("pause");
  41. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-7 11:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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