关于c++数组、指针的问题

请问以下的三条语句有什么相同点和不同点,另外请解释一下定义出来的变量的类型
int *a[4];
int (*b)[4];
inc *(c[4]);

int *a[4],可以分解成a[0] a[1] a[2] a[3] 都是一个指针,存着指向int类型的变量的指针。
例如:
int d=1;
a[0] = &d;
a[1] = &d;
这时候 *a[0]=d=1。

int (*b)[4] 是一个指向 int [4] 类型的指针,这个指针可以指向int [4]类型的数组
例如:
int f[4]={0};
int g[4]={1};
b = &f;
这时候可以通过(*b)[0],(*b)[1]来访问f中的元素。
若让b=&g就可以用过(*b)[0],(*b)[1]来访问g中的元素。

第三个和第一个一样。

如果我没错a是一个指针数组,b是一个数组指针。 国内教材上常说指针数组和数组指针。其实我也不太分不清。这个可以不用管。只要知道每个定义的真正含义就可以。
如果还搞不清楚可以在开发环境写出来调试,这样会很清楚的看到每个定义的类型。

希望你能采纳!追问

非常感谢,只是关于b还是有一点问题:
int (*b)[4]=new int[4];
这条语句为什么编译不通过?

追答

要强制类型转换的 new返回了void*类型。要用int (*b)[4] = (int (*)[4])new int[4]。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-08-14
1 a是一个有4个int *型变量的数组
2 b是一个指针,指向的是含有4个int元素的数组
3 c和a一样本回答被网友采纳
第2个回答  2012-08-14
首先 int *a[4]; []优先级高于“ * ",所以" a " 先与“ [] ”结合时一个数组, 然后与“ * ”结合就编程了一个指针数组,即有四个这样的整型指针,每个指针占取内存四个字节;

第二个: (*b)[4]; ()>[];按照上面的推论 ,就是一个数组指针了,即一个指向数组的指针;数组大小为4;

第三个与第一个相同;
第3个回答  2012-08-14
[ ]与p结合的优先级比*高
1、定义指针数组p,它由4个指向整型数据的指针元素组成 有4个指针变量
2、p为指向含4个元素的一位数组的指针变量 1个指针变量
3、同1
第4个回答  2012-08-14
int *a[4]; //a为指针数组,其元素取值为地址
int (*b)[4]; //b为一行具有4个元素的一维数组的行指针
inc *(c[4]); //可能写应该是:int *(c[4]),与第1个的a相同。
第5个回答  2012-08-14
第一个:4维int指针数组;
第二个:指针指向一个四维的数组;
第三个:同第一个。

c\/c++中的指针的应用及注意问题
int *b,b表示的是指针变量(注意,是b表示指针变量而不是*b),*表示要说明的是指针变量。大家注意int *b[2]和int(*b)[2]是不同的,int *b表示一个指针数组,而int (*b)[2]表示含有两个元素的int指针,这里要注意运算优先级问题,有助于理解指针问题。在这里大概介绍基本概念就够了,...

关于c++指针的问题请高手赐教
1、表达式中的数组名(与声明不同)被编译器当作一个指向该数组第一个元素的指针 因此如a[i]这样的访问都被编译器改写或解释为*(a+i)的形式,同样取下标操作符的操作数是可交换的,所以a[3]可以写成3[a],不过通常你不会这样做。2、下标总是与指针的偏移量相同,下标*sizeof(元素类型)就是偏...

C++指针问题?这里选项b为什么是错的?是不是题目有误?
题目正确(附实例程序验证),D选项正确的话,那么B选项明显是错误的。注意B选项得到的是 : 元素b[3][0]的值加3。详细说明:int b[4][4],数组有4行4列,注意数组下标从0开始到3。(b+3)表示第四行的起始地址,那么这个地址+3,(*(b+3)+3)就是第四行第四列数据的地址。这就是正确...

有关C++指针和数组的一个小问题
数组是一种类型,独立的类型,不是什么指针或者地址。所谓数组名能作为数组首地址,是因为c++进行了隐式的类型转换。就好像 char c = 'a';int i = c;一样,其实是int i = static_cast<int>(c);,只不过char类型被隐式转换成int不需要写出来。所以数组作为地址时c++其实做的是int *p=static_...

c++ 数组用指针方式传递给函数以后如何获得数组的长度?
将数组作为一个参数传出去,那么他就会“退化”成一个指针类型,进而失去“数组的属性”。(这里的数组不是new出来的)这里的“属性”指的是数组可以使用sizeof(Array)\/sizeof(Array[0])的方法获得其长度的方法的属性。要在一个函数中得到一个数组的长度,你应该这个数组作为一个引用传出去,那样,就能...

有关c++中数组与指针的关系
1,数组是一块内存连续的数据。2,指针是一个指向内存空间的变量。对于数组来说,数组的首地址,也可以用指针来表示操作,如:int a[10];int *p,n;p = a;对第一个元素取值,可以用几种方法:n =a[0];n = *p;n = p[0];n = *(p+0) ;3,不同的地方是数组是由编译器分配的空间,...

C++ 数组与指针
由于b是指针,无论是否指向a,指向什么,sizeof(b)等于sizeof(int),32位平台上等于4。以上讨论的问题引发的关于数组名称的问题:数组名本身是个地址常量,但是某些特殊情况下它的语义可以发生改变。例如sizeof(a),这时a表示整个数组对象(这里指语法对象,不是指类的实例)而不是这个常量本身。基于...

C++指针、数组、引用、变量作函数参数的问题
如有函数声明:void swap(int a,int b); \/\/功能是交换a,b值,但事实上对调用函数没有影响,因为swap函数的局部变量a,b在该函数执行完释放掉了,其值也就丢失了。2. 指针、数组作为参数,这是地址传递,指针和数组可以看成是指向一个或一片连续空间的指针(区别是:一个为变量地址,一个常量...

请教C++二维数组和指针的简单问题。
第二题 主要是明白*s[2]这个是什么。其实有两个操作符,一个是解引用操作符*;另外一个是下标操作符[]。查一下优先级吧。应该先是下标操作所以*s[2]变成了*(s[2])。那么s[2]是什么呢?其实由定义char s[4][6]可以明白。s中存放的是指向字符串的指针。s[2]是一个指针,指向一个字符串...

c++指针与数组首地址的问题!
在具体一点: 假设数组的首地址是INDEX1(那么INDEX1就是a[0]的地址了~), 那么这个值存在a中, 而a放在地址为INDEX2的内存位置, 其值为INDEX1 p=a 结果为 p=INDEX1, 这个是你想要的 p=&a 结果为 p=INDEX2, 这个不是你要的吧 p=&(a[0]) 结果为 p=INDEX1, 也行 个人理解, 如有...

相似回答
大家正在搜