a[5]是一个一维数组,定义指针变量int *p,那么请问p=a与p=&a的区别是什么

如题所述

在数组中,数组名表示首地址常量。a等同于&a[0]。所以p=a。就是p指向a首地址。
p=&a是错的,a已经是地址里。
可以写p=&a[0]。追问

但是~但是~书上有这种写法

追答

这里要解释下:

&的取地址的符号。

数组名a在意义上相当于一个指针,但是又不同于一般指针,相当于常量。

&a相当于取的是指针的地址,就好比你写p=a;然后&p,这样&p和a表示的不是一个意思。

所以&a相当于int**类型(也就是指向指针的指针),而你一般取数组首地址是int*类型的。

但是由于a的特殊性,这里&a和a的地址值一样而已。

来看两者区别:

a和&a分别+1以后,你就会发现两个跨度不一样(a+1跨了一个int元素大小4字节,而&a直接跨了一个数组的大小)

特别注意:我这里写的是a+1,不要写a++;a是常量指针不能改变其值!!!

追问

好的~谢谢你~爱你唷~

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-04-09
如果已定义int a[5],定义指针变量int *p,那么请问p=a这意思是p指针指向a数组的首地址,相当于p=&a[0]。
p=&a的写法是错的。因为a数组的数组名本来就是a数组的首地址,地址属于常量,常量不允许再取地址。
第2个回答  2019-04-08
有了int a[5],*p;,p=&a;显然就是错误的。int a[5],*p;说明了a和p都是int *型指针,只是a是常指针,p是指针变量,那么p=a;就合情合理;&a是指向a[5]的指针,与它类型匹配的是int (*)[5],而不是int *。所以p=&a;的等号两边类型不匹配,编译都过不了……追问

我给你看张图片

第3个回答  2019-04-10

隐式转换和显式转换的区别。

编译器遇到一维数组名取值时,按以下顺序处理:

    当有&符号时,取地址(如果数组名后面有索引 [n] 则取n元素的地址,否则取首地址)

    当有*符号时,取值(元素为指针)

    默认情况下,视作带&,即取地址(隐式转换)。

追问

好的~谢谢你~!

第4个回答  2019-04-08
// 没啥区别,都一样的。
#include <stdio.h>
int main()
{
  int a[5];
  int *p, *q;
  p = a;
  q = &a;
  printf(" a = %p\n", a);
  printf("&a = %p\n", &a);
  printf(" p = %p\n", p);
  printf(" q = %p\n", q);
}

你看看输出结果:

 a = 0x7ffecb6b8770
&a = 0x7ffecb6b8770
 p = 0x7ffecb6b8770
 q = 0x7ffecb6b8770

本回答被网友采纳
相似回答