OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2762|回复: 6

求教一个C语言问题,关于指针

[复制链接]

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2019-12-21
在线时间
21 小时
发表于 2020-2-9 19:38:20 | 显示全部楼层 |阅读模式
1金钱
请问为什么执行下面的代码,可以成功的打印出二维数组,但用注释中的语句只能成功打印第一行,而且还是反过来的。代码分析半天都不能理解这是为啥。。

#include <stdio.h>
void main()
{
    void fun(int* p);
    int a[3][4] = { 1,2,3,4, 5,6,7,8,9,10,11,12};
    fun(a[0]);
}

void fun(int* p)
{
    int i, j, temp[3][4] ;
    for (i = 0; i < 3; i++)
    {
        for (j = 3; j >=0; j--)
        {
            temp[i][j] = *p++;
            //temp[i][j] = *(*(&p + i) + j);
            printf("%d  ", temp[i][j]);
        }
        printf("\n");
    }
}

最佳答案

查看完整内容[请看2#楼]

你这玩意放在main函数里面声明什么意思? 然后你这句是想做什么? 取指针的地址然后递增,那你指针指向的地址完全就乱套了,怎么可能让你正常输出呢?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2020-2-9 19:38:21 | 显示全部楼层
  1.   void fun(int* p);
复制代码

你这玩意放在main函数里面声明什么意思?

  1. //temp[i][j] = *(*(&p + i) + j);
复制代码

然后你这句是想做什么?
取指针的地址然后递增,那你指针指向的地址完全就乱套了,怎么可能让你正常输出呢?
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2019-12-21
在线时间
21 小时
 楼主| 发表于 2020-2-10 18:59:04 | 显示全部楼层
a3748622 发表于 2020-2-10 17:57
你这玩意放在main函数里面声明什么意思?

哦哦,明白了,函数调用的时候是把a[0][0]的地址赋给指针变量p了,我想成把a[0]赋给p了
不过我还有个问题就是,对于二维数组用*p++可以按顺序取到所有值,是不是因为指针p依次指完数组第一行的元素后会自动指向下一行第一个元素?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-2-10 21:46:32 | 显示全部楼层
Blazar丶 发表于 2020-2-10 18:59
哦哦,明白了,函数调用的时候是把a[0][0]的地址赋给指针变量p了,我想成把a[0]赋给p了
不过我 ...

因为二维数组也是一片连续的存储区域。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3876
金钱
3876
注册时间
2017-3-7
在线时间
1691 小时
发表于 2020-2-11 09:48:18 | 显示全部楼层
Blazar丶 发表于 2020-2-10 18:59
哦哦,明白了,函数调用的时候是把a[0][0]的地址赋给指针变量p了,我想成把a[0]赋给p了
不过我 ...

其实a[0][0]和a[0]的地址是一个,传值是没问题的,你这问题出在p已经是数组的地址了(*p),你在赋值给temp时却取了p的地址进行计算(&p),这个地址与数组没有什么关系了。有疑问也可以打印下,看看log 1.png
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3876
金钱
3876
注册时间
2017-3-7
在线时间
1691 小时
发表于 2020-2-11 10:23:09 | 显示全部楼层
我把你的fun函数改了下,你试试,是不是这个需求
void fun(int (*p)[4])
{
  int i, j, temp[3][4] ;

  for (i = 0; i < 3; i++)
  {
    for (j = 3; j >= 0; j--)
    {
      temp[i][j] = *(*(p + i) + j);
      printf("temp[%d][%d] = %d\r\n", i, j, temp[i][j]);
    }
    printf("\r\n");
  }
}
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2019-12-21
在线时间
21 小时
 楼主| 发表于 2020-2-13 16:08:58 | 显示全部楼层
a5820736 发表于 2020-2-11 10:23
我把你的fun函数改了下,你试试,是不是这个需求
void fun(int (*p)[4])
{

是这个效果,多谢
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-20 11:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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