关于数组名和指针的问题

weibojishu1984 2010-12-02 10:09:38
#include <stdio.h>

int main(void)
{
int **p;
int arr[100];
p = &arr;

return 0;
} 编译错误//**p不能指向(*)[100]

#include <stdio.h>
int main(void)
{
int **p, *q;
int arr[100];
q = arr;
p = &q;
return 0;
} 可以编译通过

求高手解答,两种不同结果产生的深层原因。
...全文
197 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoukangli 2010-12-02
  • 打赏
  • 举报
回复
#include <stdio.h>

int main(void)
{
int **p;
int arr[100];
p = &arr;

return 0;
} 编译错误//**p不能指向(*)[100]
其中如果将将p=&arr
改为*p=arr;就不会出错,但是当对arr取地址的时候就会报错,这是什么原因呢?主要是arr根本就不是所谓的指针,更不是指针变量,在http://tech.163.com/05/0823/11/1RR94CAS00091589.html中有讲,可以看一下。其实arr是一个常量,常量是不占内存单元的,所以取地址当然会出问题。个人观点,仅做参考。

#include <stdio.h>
int main(void)
{
int **p, *q;
int arr[100];
q = arr;
p = &q;
return 0;
} 可以编译通过
中的q=arr;
p=&q;
q是指针变量时占内存单元的4个字节,当然可以取其地址,然后赋值给p。其中int **p,可视为int*(*p),(*p) 相当于一个指针变量,而p相当于指向指针变量的指针变量。所以编译通过。个人观点,仅做参考....呵呵



jasonslyvia 2010-12-02
  • 打赏
  • 举报
回复
第一个中
arr是数组名,也是数组第一个元素的首地址,其实就是一个指针,而p你声明的是指向指针的指针,你在赋值时又用了&符号,就不是指向指针了,所有编译不能通过
a707000646 2010-12-02
  • 打赏
  • 举报
回复
第一个定义的是二级指针也就是指针的指针
也就是说p指向的地址中存放的是一个指针,而第一个指向的其实是一个int的变量
第二个定义自然就对了
首先第一个p是int的指针
然后q指向p
也就是指向指针的指针
故编译能够通过
aa279686030 2010-12-02
  • 打赏
  • 举报
回复

int **p;
int arr[100];
p = &arr;

这个 很明显不能这样赋值,因为指针类型不一样。这是老生常谈的问题,arr指向的是一个int,但是&arr指向的却是一个数组,不是你所认为的指向int*,&arr类型应该可以表示为 int (*p)【100】,这是一个数组指针,指向的是一个数组。也就是说你如果进行
p + 1的操作移动的是一个数组,你可以试试下面的程序

#include <stdio.h>

int main(void)
{
int (*p)[100];
int arr[100];
p = &arr;
printf("%d\t%d\n",p,p + 1);
return 0;
}

两个指针相差 400。就是移动的一个数组,不过这个p+1指向的地址是不安全的。


int **p, *q;
int arr[100];
q = arr;
p = &q;
return 0;

这里的q是一个指针的指针,所以他可以存储指针的地址,显然是正确的。

看的出来,楼主对数组指针理解的不太透彻,希望对你有帮助。
bluewanderer 2010-12-02
  • 打赏
  • 举报
回复
第二个你p指向的是q...

第一个你得 int (*p)[100]; ... p = &arr;
wasx1 2010-12-02
  • 打赏
  • 举报
回复
我也不解,求楼下解答

69,391

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧