鱼C论坛

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

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

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

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

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

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

void output(char *p[])
{
        int i = 0;
        for(i = 0; i<5; i++)
        {
                printf("%s\n",p[i]);
        }
}

void output1(char *p[])
{
        int i = 0;
        int j = 0;

        for(i=0; i<5 ; i ++)
        {
                for(j=0; j<strlen(p[i]) ; j++)
                {
                        printf("%c",p[i][j]);
                }
                printf("\n");
        }
}

int main()
{
        char arr[5][12];
        char *p[5];
        int i = 0;
        for(i = 0 ; i < 5 ; i++)
        {
                p[i] = arr[i];
                scanf("%s",p[i]);
        }

        output(p);
        output1(p);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-2 20:57:39 | 显示全部楼层
char **p;
p = arr;
这样试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好像还是不太行 提示了warning: assignment from incompatible pointer type
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-2 21:01:58 | 显示全部楼层
给你一个数组,你看懂了,你的问题就解决了,我就不改我程序里的变量名称了
#include<stdio.h>
int main()
{
    int i,j;
        int *p,*q,*r,(*t)[4];
        int a[3][4] = {{1, 3, 5, 7}, {9, 11, 13, 15}, {17, 19, 21, 23}};
    p = &a[0][0];
    q = a[0];
    r = *a;
    t = a;


    // p = &a[0][0] 的输出模式
        for (i = 0; i < 3; ++i)
        {
        for (j = 0; j < 4; ++j)
                {
            printf("%2d ", *p++);  // 与 *(p + i * 4 + j) 等价
                }
        printf("\n");
        }
        printf("\n");

        
        // q = a[0] 的输出模式
    for(i = 0;i < 3;i++)
    {
        for(j = 0;j < 4;j++)
                {
            printf("%2d ",*q++);  // 与 *(q + i * 4 + j) 等价
                }
        printf("\n");
     }
     printf("\n");


    // r = *a 的输出模式
        for(i = 0;i < 3;i++)
    {
        for(j = 0;j < 4;j++)
                {
            printf("%2d ",*r++);  // 与 *(r + i * 4 + j) 等价
                }
        printf("\n");
     }
     printf("\n");


    // t = a 的输出模式
        for (i = 0; i < 3;i++)
        {
        for (j = 0; j < 4;j++)
                {
            printf("%2d ", *(*(t + i) + j));
                }
        printf("\n");
        }
        printf("\n");

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

 楼主| 发表于 2020-11-2 21:12:29 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

四种定义指针的模式,知道了怎么定义,也知道了该种模式下它的输出,利用指针进行地址传递,你不会吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-2 21:54:28 | 显示全部楼层
以下是以第四种模式定义函数,并通过指针的引用来传递参数的实例(这种定义模式,用得非常地广泛)
#include<stdio.h>
int main()
{
        int print(int(*t)[4], int n);                 // 定义一个输出函数
        int(*t)[4];
        int a[3][4] = { { 1, 3, 5, 7 },{ 9, 11, 13, 15 },{ 17, 19, 21, 23 } };
        t = a;
        print(t,3);                                      // 将数组的首地址及长度作为实参传递给调用函数
        return 0;
}

int print(int(*t)[4], int n)
{
        int i, j;
        for (i = 0; i < n;i++)
        {
                for (j = 0; j < 4;j++)
                {
                        printf("%2d ", *(*(t + i) + j));
                }
                printf("\n");
        }
        printf("\n");
        return 0;

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

void output(char *p[])
{
        int i = 0;
        for(i = 0; i<5; i++)
        {
                printf("%s\n",p[i]);
        }
}

void output1(char *p[])
{
        int i = 0;
        int j = 0;

        for(i=0; i<5 ; i ++)
        {
                for(j=0; j<strlen(p[i]) ; j++)
                {
                        printf("%c",p[i][j]);
                }
                printf("\n");
        }
}

int main()
{
        char arr[5][12];
        char *p[5];
        int i = 0;
        for(i = 0 ; i < 5 ; i++)
        {
                p[i] = arr[i];
                scanf("%s",p[i]);
        }

        output(p);
        output1(p);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

他一个函数都搞不明白,你还弄两个,他不晕才怪
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 00:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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