C语言中数组指针关于p=a,p=&a等问题!!

 我来答
楚玉巧关亥
2019-05-03 · TA获得超过3.7万个赞
知道大有可为答主
回答量:1.2万
采纳率:33%
帮助的人:772万
展开全部
问题1:一维数组名与二维数组名含义是不一样的,当然跟你理解的指向行或者列是有一定的偏差的。
对于一维数组,比如int
a[4],a代表的是int型的指针,其地址指向a[0],对于二维数组比如a[2][4],a代表的是也是指针,只不过不是简单的int型指针,而是你代码中的数组指针,它与一维数组中指针的区别是:当一维数组名a++时(即步长),指针移动字节数为int型数据所占字节数,但是对于二维数组中a++时,指针移动字节数为列数乘以int型数据所占字节数,即4(代表数组有4列)乘以sizeof(int)。
问题2:先说一下&a代表的意思。假设数组为int
a[4]
对于一维数组&a代表的是int型数组指针,它与a的区别是a是int型指针,但是&a代表是int型数组指针,&a的步长为以为数组大小乘以int型数据所占字节数,所以当p
=
a时,这两个类型不匹配,因为p为int型数组指针,a为简单int型指针,对于表达式p
=
&a,这个表达式刚好类型匹配,它们的步长都是(4
*
sizeof(int))。
问题3:对于int
(*p)[4]代表的是int型数组指针,步长是(4
*
sizeof(int))。首先说明的是对于第7行程序打印的结果不是a[3]对应的值,这样的操作属于越界(即访问到数组外的内存)。对于(*p)[3]表达式代表*(p
+
3),因为p步长为16字节(假设int型数据占4字节),所以*(p
+
3)其实访问的是数组首地址加上16乘以3地址处的数据。
问题4:对于二维数组int
a[2][4]以及int
(*p)[4],因为a与p都是int型数组指针,所以类型匹配,所以对于第6行:p
=
a即可,如果想输出a[0][3],用printf("%d\n",
*(*(p)
+
3));即可。对于二维数组而言,存在&a的语句,它同样是数组指针,其步长是行数乘以列数乘以int型所占字节数,对于
int
a[2][4],&a的步长为2
*
4
*
sizeof(int)。
问题:对于二维数组*score它也是一个指针,并且是个数组指针,如果改成&score以后,虽然都是数组指针,但是步长不一致,编译器会报警告。
希望上述回答对你有一定帮助。
职场小心机233
2019-05-15 · TA获得超过3.6万个赞
知道大有可为答主
回答量:1.2万
采纳率:30%
帮助的人:1047万
展开全部
问题1:你这种理解是对的;比如数组int
b[2][2]={1,2,3,4};对于int
*p=b[0];那么p指向的数据就是{1,2};同理,*p=b[1];p指向{3,4};
问题2:在32位系统中,确实a

&a传递的值都是数组的首地址(4BYTES);但是有个传递给什么类型数据的问题,如果是传递给简单的指针如int
*p;那么这两种形式没有差别;汇编代码完全是一样的;但是你这里是传递给指针数组int
(*p)[4];就有类型匹配的问题在里面;这时的p表示的是指针数组的首地址,而不是一个简单的变量你要明白;
问题3:依然是行指;(*p)[3]表示的是数组的第4个元素要注意;
问题4:二维以上数组的数组名是没有任何意义的;比如二维;a[2][4];有意义的首地址是a[0]和a[1];
程序2:明确地告诉你:不能!
注意score是二维数组;二维数组的数组名称不能像一维那样代表首地址;如果非得取首地址;那么是如下的取法:(加*)
int
a[2][2]={1,2,3,4};
00401028
C7
45
F0
01
00
00
00
mov
dword
ptr
[ebp-10h],1
0040102F
C7
45
F4
02
00
00
00
mov
dword
ptr
[ebp-0Ch],2
00401036
C7
45
F8
03
00
00
00
mov
dword
ptr
[ebp-8],3
0040103D
C7
45
FC
04
00
00
00
mov
dword
ptr
[ebp-4],4
18:
int
*p=*a;
00401044
8D
45
F0
lea
eax,[ebp-10h]//第一个数据的地址传递给eax
00401047
89
45
EC
mov
dword
ptr
[ebp-14h],eax//eax传递给参数*p
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
栗诚秦姬
2019-12-02 · TA获得超过3.7万个赞
知道大有可为答主
回答量:1.2万
采纳率:35%
帮助的人:1041万
展开全部
先跟你说最后的问题吧。其他的你百度hi我,或者其他方式解答。
a[n],*[a+n]等价能理解吧?所以a是一个指针,代表数组的首地址,指向一个数组类型(如int
float)的变量。
那么b[N][M],可以试着这样理解:把b[N]看作a,那么b[n][m]与*(b[n]+m)等价。由于a是一个指针,
所以b[N]代表的,是一个指针数组。b所代表的,是指向一个指针数组的指针,并且是b[N]的首地址。
average第一个参数需要的是一个float指针,所以赋值*score

score[N]指针数组的首个指针,代表&score[0][0]。
可以改写成&score[0][0],但不能写成&score。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
皇甫兰英曹璧
2019-04-26 · TA获得超过3.6万个赞
知道大有可为答主
回答量:1.2万
采纳率:26%
帮助的人:901万
展开全部
根据数组下标记最好,比如说你定义一个a[5]={2,3,5,6,7},那么a[0]=2,a[1]=3,a[2]=5......
在一个变量前加一个*表示是一个指针变量,他是指向变量地址的指针的,所以要加一个&表示取地址;
这个还是那句话,你只管下标,
int
(*p)[2][4];//也要改二维的
p=&a;
printf("%d\n",(*p)[0][3]);
&这个表示取地址,而12是个常量
这样就不能用&,而*score表示一个指针变量
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
山仁戴绸
2019-06-01 · TA获得超过3.6万个赞
知道大有可为答主
回答量:1.3万
采纳率:33%
帮助的人:707万
展开全部
你说的*(p++)h和*p++是等价的
但是这里的++是先用在加所以结果都是10
要是程序是这样的
#include
<stdio.h>
void
main()
{
int
a[10]={10,11,22,33,44,55,66,77,88,99},*p;
p=a;
printf("%d\n",*(p++));
printf("%d\n",*(p++));
p=a;
printf("%d\n",*p++);
printf("%d\n",*p++);
}
结果就会变成11了
希望采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式