鱼C论坛

 找回密码
 立即注册
查看: 3239|回复: 11

[已解决]如何将一个二维数组赋值给一个指针数组

[复制链接]
发表于 2020-11-2 20:53:27 | 显示全部楼层 |阅读模式

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

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

x
如果有一个已知的定义好的二维数组arr[a][b],我想要创建一个指针数组用来传递这个二维数组,那么在申明了“char *ptr[a];”之后应该怎么办?
我尝试了直接让“ptr=arr”好像不太行,小白求助各位大佬帮忙解答疑惑!
最佳答案
2020-11-2 22:28:34
  1. #include <stdio.h>
  2. #include <string.h>

  3. void output(char *p[])
  4. {
  5.         int i = 0;
  6.         for(i = 0; i<5; i++)
  7.         {
  8.                 printf("%s\n",p[i]);
  9.         }
  10. }

  11. void output1(char *p[])
  12. {
  13.         int i = 0;
  14.         int j = 0;

  15.         for(i=0; i<5 ; i ++)
  16.         {
  17.                 for(j=0; j<strlen(p[i]) ; j++)
  18.                 {
  19.                         printf("%c",p[i][j]);
  20.                 }
  21.                 printf("\n");
  22.         }
  23. }

  24. int main()
  25. {
  26.         char arr[5][12];
  27.         char *p[5];
  28.         int i = 0;
  29.         for(i = 0 ; i < 5 ; i++)
  30.         {
  31.                 p[i] = arr[i];
  32.                 scanf("%s",p[i]);
  33.         }

  34.         output(p);
  35.         output1(p);

  36.         return 0;
  37. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-11-2 20:57:39 | 显示全部楼层
  1. char **p;
  2. p = arr;
复制代码

这样试试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-2 21:01:10 | 显示全部楼层

好像还是不太行 提示了warning: assignment from incompatible pointer type
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-2 21:01:58 | 显示全部楼层
给你一个数组,你看懂了,你的问题就解决了,我就不改我程序里的变量名称了


  1. #include<stdio.h>
  2. int main()
  3. {
  4.     int i,j;
  5.         int *p,*q,*r,(*t)[4];
  6.         int a[3][4] = {{1, 3, 5, 7}, {9, 11, 13, 15}, {17, 19, 21, 23}};
  7.     p = &a[0][0];
  8.     q = a[0];
  9.     r = *a;
  10.     t = a;


  11.     // p = &a[0][0] 的输出模式
  12.         for (i = 0; i < 3; ++i)
  13.         {
  14.         for (j = 0; j < 4; ++j)
  15.                 {
  16.             printf("%2d ", *p++);  // 与 *(p + i * 4 + j) 等价
  17.                 }
  18.         printf("\n");
  19.         }
  20.         printf("\n");

  21.        
  22.         // q = a[0] 的输出模式
  23.     for(i = 0;i < 3;i++)
  24.     {
  25.         for(j = 0;j < 4;j++)
  26.                 {
  27.             printf("%2d ",*q++);  // 与 *(q + i * 4 + j) 等价
  28.                 }
  29.         printf("\n");
  30.      }
  31.      printf("\n");


  32.     // r = *a 的输出模式
  33.         for(i = 0;i < 3;i++)
  34.     {
  35.         for(j = 0;j < 4;j++)
  36.                 {
  37.             printf("%2d ",*r++);  // 与 *(r + i * 4 + j) 等价
  38.                 }
  39.         printf("\n");
  40.      }
  41.      printf("\n");


  42.     // t = a 的输出模式
  43.         for (i = 0; i < 3;i++)
  44.         {
  45.         for (j = 0; j < 4;j++)
  46.                 {
  47.             printf("%2d ", *(*(t + i) + j));
  48.                 }
  49.         printf("\n");
  50.         }
  51.         printf("\n");

  52. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-2 21:05:24 | 显示全部楼层
空羊羊 发表于 2020-11-2 21:01
好像还是不太行 提示了warning: assignment from incompatible pointer type

我也不会了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-2 21:11:57 | 显示全部楼层
风过无痕1989 发表于 2020-11-2 21:01
给你一个数组,你看懂了,你的问题就解决了,我就不改我程序里的变量名称了

谢谢大佬,但是我想要的效果是把这个二维数组传递给指针数组后,将指针数组作为函数的参数传递后,能够直接在函数内部通过对这个指针数组进行索引,直接得到其中的指针,也就是本来二维数组的每一行。要是用数组指针的话我感觉好像不能实现?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-2 21:12:29 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-2 21:24:58 | 显示全部楼层
空羊羊 发表于 2020-11-2 21:11
谢谢大佬,但是我想要的效果是把这个二维数组传递给指针数组后,将指针数组作为函数的参数传递后,能够直 ...

四种定义指针的模式,知道了怎么定义,也知道了该种模式下它的输出,利用指针进行地址传递,你不会吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-2 21:54:28 | 显示全部楼层
以下是以第四种模式定义函数,并通过指针的引用来传递参数的实例(这种定义模式,用得非常地广泛)


  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int print(int(*t)[4], int n);                 // 定义一个输出函数
  5.         int(*t)[4];
  6.         int a[3][4] = { { 1, 3, 5, 7 },{ 9, 11, 13, 15 },{ 17, 19, 21, 23 } };
  7.         t = a;
  8.         print(t,3);                                      // 将数组的首地址及长度作为实参传递给调用函数
  9.         return 0;
  10. }

  11. int print(int(*t)[4], int n)
  12. {
  13.         int i, j;
  14.         for (i = 0; i < n;i++)
  15.         {
  16.                 for (j = 0; j < 4;j++)
  17.                 {
  18.                         printf("%2d ", *(*(t + i) + j));
  19.                 }
  20.                 printf("\n");
  21.         }
  22.         printf("\n");
  23.         return 0;

  24. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-2 22:28:34 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdio.h>
  2. #include <string.h>

  3. void output(char *p[])
  4. {
  5.         int i = 0;
  6.         for(i = 0; i<5; i++)
  7.         {
  8.                 printf("%s\n",p[i]);
  9.         }
  10. }

  11. void output1(char *p[])
  12. {
  13.         int i = 0;
  14.         int j = 0;

  15.         for(i=0; i<5 ; i ++)
  16.         {
  17.                 for(j=0; j<strlen(p[i]) ; j++)
  18.                 {
  19.                         printf("%c",p[i][j]);
  20.                 }
  21.                 printf("\n");
  22.         }
  23. }

  24. int main()
  25. {
  26.         char arr[5][12];
  27.         char *p[5];
  28.         int i = 0;
  29.         for(i = 0 ; i < 5 ; i++)
  30.         {
  31.                 p[i] = arr[i];
  32.                 scanf("%s",p[i]);
  33.         }

  34.         output(p);
  35.         output1(p);

  36.         return 0;
  37. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-2 23:36:32 | 显示全部楼层

他一个函数都搞不明白,你还弄两个,他不晕才怪
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-3 20:20:09 | 显示全部楼层
风过无痕1989 发表于 2020-11-2 21:54
以下是以第四种模式定义函数,并通过指针的引用来传递参数的实例(这种定义模式,用得非常地广泛)

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-27 11:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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