C程序:为什么加上char (*p4)[5] = a;这句后编译出错,请问char (*p4)[5]=a;与char (*p4)[5]=&a;有什么区别?

hei鹰 2011-08-30 10:35:29
#include <stdio.h>

void main()
{
char a[5] = {'A','B','C','D','E'};
char (*p3)[5] = &a;
//char (*p4)[5] = a;
printf("p3+1 = %x \n",p3+1);
//pritnf("p4+1 = %x \n",p4+1);
}
...全文
409 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
hei鹰 2012-03-19
  • 打赏
  • 举报
回复
char (*p3)[5]

=======》 char *[4] p3
这种指针类型。

其实就是a,和&a的区别,a所代表的是数组首元素的首地址,而&a代表的是数组的首地址。
modicum_ck 2011-09-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 weiguozheheiying 的回复:]
#include <stdio.h>

void main()
{
char a[5] = {'A','B','C','D','E'};
char (*p3)[5] = &a;
//char (*p4)[5] = a;
printf("p3+1 = %x \n",p3+1);
//pritnf("p4+1 = %x \n",p4+1); 首先printf打错了
}
[/Quote]

LZ所问的是char (*p3)[5] = &a; 和 char (*p4)[5] = a;的区别。
其实就是a,和&a的区别,a所代表的是数组首元素的首地址,而&a代表的是数组的首地址。
他们的地址从数值上来说是一样的,但所表示的意义不同。
对&a+1 来说,这个1不是数值1,而是它的类型如:
char a[5] = {'A','B','C','D','E'};
char *p = &a + 1;
char *pp = a + 1;
*p = a + 1*sizeof(a); //sizeof(a), 是5个字节&a为数组首地址,指针就移到数组之外了。
*pp = a + 1 * sieof(char); //sizeof(char) , 因为a代表数组首元素首地址,所以指针移一位。

主要区别为&a,a

wdxy520 2011-09-11
  • 打赏
  • 举报
回复
这句话严重有问题 printf("p3+1 = %x \n",p3+1);
按你的意思是要输出下个一含有五个字符数组的值 即

{'A','B','C','D','E'}; P
{‘’‘’‘’‘’‘’} P+1
cao_julians 2011-09-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 huang_gen 的回复:]
char (*p3)[5] = &a ; //&a的类型是 char(*)[5]
//char (*p4)[5] = a; //a的类型是 char *
[/Quote]
正确.
&a是整个数组的首址,数组类型 是char[5],指针是char(*)[5]<=&(char [5])
a是&a[0],是数组首元素的地址,元素类型是 char*,指针是char(*)[5]?<=char*

指针的赋值和初始化要求类型严格一致,除了void*外
ming_road 2011-09-10
  • 打赏
  • 举报
回复
简单的说:首先你的定义的p3,P4都是指向数组的指针,直接用a,它转化为指向字符的指针,用&a才是数组的地址
cnc10000 2011-09-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 luckygxboy 的回复:]
首先,指出一个问题:
char a[5] = {'A','B','C','D','E'};

应该改为:
char a[5] = "ABCD";

或者
char a[5] = {'A','B','C','D','\0'};

至于为什么,想必你懂的。

然后,说主要问题:
char (*p4)[5]的意思是p4是一个指针,起指向为包含5个元素的数值,和char*是完全……
[/Quote]
++
dreamzme 2011-09-10
  • 打赏
  • 举报
回复
当然不对,类型不匹配。
saziwoai 2011-09-09
  • 打赏
  • 举报
回复
由于p3,p4都是数组指针,且赋值语句两端数据类型必须相同,p3,p4都是指向整个数组的首地址,而a代表数组第一个元素的首地址,类型不符所以出现错误。而&a就代表整个数组的首地址,虽然&a与a数值相同但是意义不同。
jason-xu 2011-08-30
  • 打赏
  • 举报
回复
char (*p3)[5]表示p3为一个数组指针,是一个指向char[5]的指针,所以用p3 = &a;正确
而a表示的是数组,它的类型为char [5],虽然他们的值是一样的,但类型不一样
luckygxboy 2011-08-30
  • 打赏
  • 举报
回复
首先,指出一个问题:
char a[5] = {'A','B','C','D','E'};

应该改为:
char a[5] = "ABCD";

或者
char a[5] = {'A','B','C','D','\0'};

至于为什么,想必你懂的。

然后,说主要问题:
char (*p4)[5]的意思是p4是一个指针,起指向为包含5个元素的数值,和char*是完全不同的!p4++指向的并不'B',而是a[4]之后的那个地址!经常碰见的情况是这样:
char b[2][3]={"AA","BB"};
char (*bp)[3]=b;
bp++;
printf("%s",*bp);//得出的是"BB",而不是'A'。

a的意思与&a[0]的意思相同,也就是a[0]的地址,是(char*)类型,可以这样 char* px = a 或者 char* px = &a[0],但不能是char (*px)[5]=a。
而&a指的是a[5]的地址,也就是数组的地址,其类型是和p4相匹配的,因而可以进行赋值。
要记住,a和&a虽在数值上是相同的,但是完全是不同的概念,很多书上混淆了他们的概念,我认为是不正确的。

有点困,发了才发现有几个地方写错了,重发下
condlover 2011-08-30
  • 打赏
  • 举报
回复
mark ......
luckygxboy 2011-08-30
  • 打赏
  • 举报
回复
char b[2][3]={"AA","BB"}; //应该是这样,多加了个括号
luckygxboy 2011-08-30
  • 打赏
  • 举报
回复
首先,指出一个问题:
char a[5] = {'A','B','C','D','E'};

应该改为:
char a[5] = "ABCD";

或者
char a[5] = {'A','B','C','D','\0'};

至于为什么,想必你懂的。

然后,说主要问题:
char (*p4)[5]的意思是p4是一个指针,起指向为包含5个元素的数值,和char*是完全不同的!p4++指向的并不'B',而是a[4]之后的那个地址!经常碰见的情况是这样:
char b[2][3]={{"AA","BB"}};
char (*bp)[3]=b;
b++;
printf("%s",*b);//得出的是"BB",而不是'A'。

a的意思与&a[0]的意思相同,也就是a[0]的地址,是(char*)类型,可以这样 char* px = a 或者 char* px = &a[0],但不能是char (*px)[5]=a。
而&a指的是a[5]的地址,也就是数组的地址,其类型是和p4相匹配的,因而可以进行赋值。
要记住,a和&a虽在数值上是相同的,但是完全是不同的概念,很多书上混淆了他们的概念,我认为是不正确的。
ningto.com 2011-08-30
  • 打赏
  • 举报
回复
char (*p3)[5];
指向二维数组的指针, 类似如指向指针的指针, 所以
char (*p4)[5] = a;有问题, a只是指向一维数组的指针,
char (*p4)[5] = &a;这样才可以, 指向指针a自己的地址,然后a指向另外一个地址就构成了指向指针的指针
crjwlaq 2011-08-30
  • 打赏
  • 举报
回复
指针的指针 和 指针是有区别的
Lost_In_Code 2011-08-30
  • 打赏
  • 举报
回复
举个列子就很明白了.
比如说定义一个数组是char test[3][5].那么在内存中 test[0][4] 后面的那个char是谁那?是test[1][0].
你定义的char (*p3)[5]也是这个道理.p3是一个指向一维数组的一个指针.就相当于前面例子中得test.那么p3+1对应的应该是第六个字符.你定义了五个.必然会导致错误了.
新加坡下雨了 2011-08-30
  • 打赏
  • 举报
回复
问char (*p4)[5]=a;与char (*p4)[5]=&a;有什么区别?[问题点数:20分]

因为(*p4)[5]是二维指针的列指针,把一个数值赋值给一个地址,肯定会不通过,而后者是把a给取地址了,就是地址之间的赋值,所以可以通过

*(*p4)[5]=a;应该就可以了
huang_gen 2011-08-30
  • 打赏
  • 举报
回复
char (*p3)[5] = &a ; //&a的类型是 char(*)[5]
//char (*p4)[5] = a; //a的类型是 char *
a_sum_of_money 2011-08-30
  • 打赏
  • 举报
回复
sorry 看错了,,,

猜测是
因为 数组名a 是一个常量指针 不能赋给 前面的变量~~
坐等牛人
a_sum_of_money 2011-08-30
  • 打赏
  • 举报
回复
vc++6.0下编译能通过啊~~

69,371

社区成员

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

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