C程序:为什么加上char (*p4)[5] = a;这句后编译出错,请教char (*p4)[5]=a;与char (*p4)[5]=&a;有什么区别
C程序:为什么加上char (*p4)[5] = a;这句后编译出错,请问char (*p4)[5]=a;与char (*p4)[5]=&a;有什么区别?
#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);
}
------解决方案--------------------
char (*p3)[5] = &a ; //&a的类型是 char(*)[5]
//char (*p4)[5] = a; //a的类型是 char *
------解决方案--------------------
首先,指出一个问题:
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虽在数值上是相同的,但是完全是不同的概念,很多书上混淆了他们的概念,我认为是不正确的。
有点困,发了才发现有几个地方写错了,重发下
------解决方案--------------------
简单的说:首先你的定义的p3,P4都是指向数组的指针,直接用a,它转化为指向字符的指针,用&a才是数组的地址
------解决方案--------------------
#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);
}
------解决方案--------------------
char (*p3)[5] = &a ; //&a的类型是 char(*)[5]
//char (*p4)[5] = a; //a的类型是 char *
------解决方案--------------------
首先,指出一个问题:
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虽在数值上是相同的,但是完全是不同的概念,很多书上混淆了他们的概念,我认为是不正确的。
有点困,发了才发现有几个地方写错了,重发下
------解决方案--------------------
简单的说:首先你的定义的p3,P4都是指向数组的指针,直接用a,它转化为指向字符的指针,用&a才是数组的地址
------解决方案--------------------