数组指针输出错误求指导
求大神教导程序1:
#include <stdio.h>
int main()
{
int a[] = { {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[] = { {0,1,2},{3,4,5} };
int* p;
p = *a;
printf("%d\n%d\n%d", *(p + 1),( *(p + 1)+1), *(*(p + 1) + 1));
}
报错:0x00031887 处(位于 ConsoleApplication74.exe 中)引发的异常: 0xC0000005: 读取位置 0xCCCCCCD0 时发生访问冲突。
int* p;
你这样定义的是一个指针数组,指针数组包含三个指针,分别是p,p,p。但是你为什么要给p赋值呢,这肯定会出错啊。
你是不是打算定义一个数组指针啊?数组指针是这样定义的。
int(*p);
#include <stdio.h>
int main()
{
int a[] = { {0,1,2},{3,4,5} };
int(* p);
p = a;
printf("%d\n%d\n%d", *(p + 1),( *(p + 1)+1), *(*(p + 1) + 1));
} sunrise085 发表于 2020-9-11 22:32
你这样定义的是一个指针数组,指针数组包含三个指针,分别是p,p,p。但是你为什么要给p赋值呢 ...
#include <stdio.h>
int main()
{
int a[] = { {0,1,2},{3,4,5} };
int* p;
p = *a;
int(*p2);
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的区别求分析,谢谢了 sunrise085 发表于 2020-9-11 22:32
你这样定义的是一个指针数组,指针数组包含三个指针,分别是p,p,p。但是你为什么要给p赋值呢 ...
三种方式输出结果都是一样的
14546772
1
14546784
4
14546772
1
14546784
4
14546772
1
14546784
4 汽车行业工程师 发表于 2020-9-11 23:54
#include
int main()
首先,p2 = a,第一个输出与第三个输出若有不相同,天理不容!
其次,我们再来看二维数组与指针的一些概念,如下:
a 二维数组名,指向一维数组a,即0行首地址
a,*(a + 0),*a 0行0列元素地址
a + 1,&a 1行首地址
a,*(a + 1) 1行0列元素a的地址
a + 2,*(a + 1) + 2,&a 1行2列元素a的地址
(a + 2),*(*(a + 1) + 2),a 1行2列元素a的值
由上表可以看出:0行首地址的 a 与 0行0列元素地址*a,不用说,肯定是相同的;*a + 1 指向0行1列元素地址,*(*a + 1) 加*就是取地址的值,p是定义的数组指针,它是指向一维数组a的,也即0行首地址,加*后的 *p 便指向转变了,指向0列了并取其元素值(此时只是改变了指向的方向,并没有改变其位置。这就好比班长与排长的关系,0行0列的兵,对班长而言就是他们班的第一名战士,而对排长而言,却成了他们排的第一名战士),再加1后的 *p + 1 便指向了0行1列了并取其值。后面的你自己慢慢分析,请原谅,现在时间也不早了,已经是深夜1点50分了。 汽车行业工程师 发表于 2020-9-11 23:54
#include
int main()
在使用上,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)吧 风过无痕1989 发表于 2020-9-12 01:52
首先,p2 = a,第一个输出与第三个输出若有不相同,天理不容!
其次,我们再来看二维数组与指针的一些 ...
感谢老哥{:5_95:} sunrise085 发表于 2020-9-12 11:22
在使用上,a和p2基本上是一样的,不过有一点:a是二维数组,p2是数组指针,两者是不一样的类型哟~~
p和p ...
感谢老哥,想通了
页:
[1]