鱼C论坛

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

[已解决]数组指针输出错误求指导

[复制链接]
发表于 2020-9-11 22:21:08 | 显示全部楼层 |阅读模式

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

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

x
求大神教导


程序1:
#include <stdio.h>

int main()
{
        int a[][3] = { {0,1,2},{3,4,5} };
       
        printf("%d\n%d\n%d", *(a + 1),*(a + 1)+1, *(*(a + 1) + 1));
}

可运行,输出 3和4的地址及 4的值





把数组转给指针P后则无法正常输出


程序2:
#include <stdio.h>

int main()
{
        int a[][3] = { {0,1,2},{3,4,5} };
        int* p[3];
        p[3] = *a;
        printf("%d\n%d\n%d", *(p + 1),( *(p + 1)+1), *(*(p + 1) + 1));
}


报错:0x00031887 处(位于 ConsoleApplication74.exe 中)引发的异常: 0xC0000005: 读取位置 0xCCCCCCD0 时发生访问冲突。
最佳答案
2020-9-12 11:22:27

在使用上,a和p2基本上是一样的,不过有一点:a是二维数组,p2是数组指针,两者是不一样的类型哟~~
p和p2的区别,p是简单的int类型指针,指向一个int类型的变量,p++是向后移动一个int类型的数据长度,即4个字节,p2是数组指针,指向一个长度为3的int类型数组,p2++跳过的是3个int类型的数据的长度,即12个字节

另外你在三楼的程序中第二个printf中,*p+1  你想不到的是什么意思,估计与结果不太一样吧?*p+1是先取*p的值,即0,然后将该数字+1,你应该是打算去*(p+1)吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-11 22:32:34 | 显示全部楼层
int* p[3];

你这样定义的是一个指针数组,指针数组包含三个指针,分别是p[0],p[1],p[2]。但是你为什么要给p[3]赋值呢,这肯定会出错啊。
你是不是打算定义一个数组指针啊?数组指针是这样定义的。
int(*p)[3];
#include <stdio.h>

int main()
{
        int a[][3] = { {0,1,2},{3,4,5} };
        int(* p)[3];
        p = a;
        printf("%d\n%d\n%d", *(p + 1),( *(p + 1)+1), *(*(p + 1) + 1));
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-11 23:54:14 | 显示全部楼层
sunrise085 发表于 2020-9-11 22:32
你这样定义的是一个指针数组,指针数组包含三个指针,分别是p[0],p[1],p[2]。但是你为什么要给p[3]赋值呢 ...

#include <stdio.h>

int main()
{
        int a[][3] = { {0,1,2},{3,4,5} };
        int* p;
        p = *a;

        int(*p2)[3];
        p2 = a;
       
        printf("%d\n%d\n%d\n%d\n", *a + 1, *(*a + 1), *(a + 1) + 1, *(*(a + 1) + 1));

        printf("\n\n%d\n%d\n%d\n%d\n", p + 1, *p + 1, p + 4, *(p + 4));
        printf("\n\n%d\n%d\n%d\n%d\n", *p2 + 1, *(*p2 + 1), *(p2 + 1) + 1, *(*(p2 + 1) + 1));

}



做了一个测试,求分析。
可以不可以理解P2与数组等价,那P与P2的区别求分析,谢谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-11 23:54:54 | 显示全部楼层
sunrise085 发表于 2020-9-11 22:32
你这样定义的是一个指针数组,指针数组包含三个指针,分别是p[0],p[1],p[2]。但是你为什么要给p[3]赋值呢 ...

三种方式输出结果都是一样的


14546772
1
14546784
4


14546772
1
14546784
4


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

使用道具 举报

发表于 2020-9-12 01:52:56 | 显示全部楼层

首先,p2 = a,第一个输出与第三个输出若有不相同,天理不容!

其次,我们再来看二维数组与指针的一些概念,如下:

a                                                       二维数组名,指向一维数组a[0],即0行首地址
a[0],*(a + 0),*a                                0行0列元素地址
a + 1,&a[1]                                       1行首地址
a[1],*(a + 1)                                     1行0列元素a[1][0]的地址
a[1] + 2,*(a + 1) + 2,&a[1][2]          1行2列元素a[1][2]的地址
(a[1] + 2),*(*(a + 1) + 2),a[1][2]     1行2列元素a[1][2]的值

由上表可以看出:0行首地址的 a 与 0行0列元素地址*a,不用说,肯定是相同的;*a + 1 指向0行1列元素地址,*(*a + 1) 加*就是取地址的值,p是定义的数组指针,它是指向一维数组a[0]的,也即0行首地址,加*后的 *p 便指向转变了,指向0列了并取其元素值(此时只是改变了指向的方向,并没有改变其位置。这就好比班长与排长的关系,0行0列的兵,对班长而言就是他们班的第一名战士,而对排长而言,却成了他们排的第一名战士),再加1后的 *p + 1 便指向了0行1列了并取其值。后面的你自己慢慢分析,请原谅,现在时间也不早了,已经是深夜1点50分了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-9-12 11:22:27 | 显示全部楼层    本楼为最佳答案   

在使用上,a和p2基本上是一样的,不过有一点:a是二维数组,p2是数组指针,两者是不一样的类型哟~~
p和p2的区别,p是简单的int类型指针,指向一个int类型的变量,p++是向后移动一个int类型的数据长度,即4个字节,p2是数组指针,指向一个长度为3的int类型数组,p2++跳过的是3个int类型的数据的长度,即12个字节

另外你在三楼的程序中第二个printf中,*p+1  你想不到的是什么意思,估计与结果不太一样吧?*p+1是先取*p的值,即0,然后将该数字+1,你应该是打算去*(p+1)吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-12 13:52:15 | 显示全部楼层
风过无痕1989 发表于 2020-9-12 01:52
首先,p2 = a,第一个输出与第三个输出若有不相同,天理不容!

其次,我们再来看二维数组与指针的一些 ...

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

使用道具 举报

 楼主| 发表于 2020-9-12 13:52:48 | 显示全部楼层
sunrise085 发表于 2020-9-12 11:22
在使用上,a和p2基本上是一样的,不过有一点:a是二维数组,p2是数组指针,两者是不一样的类型哟~~
p和p ...

感谢老哥,想通了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 06:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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