首页 > 试题广场 >

若有定义 typedef char T[10] ; T *

[单选题]
若有定义
typedef char T[10] ; 
T * a ; 
上述定义中a的类型与下面选项中完全相同的是?


  • char a[10] ;
  • char (*a)[10] ;
  • char * a ;
  • char *a[10] ;
推荐
本人在vs上验证是B
a到底是指向一个10个数据的指针,还是一个指向10个指针的数组
我认为偏向前者

看分析:
T b;
相当于 char b[10];
相信大家对这个没啥意见吧
那么,
T *a;
也就是一个指针a指向了一片空间,空间连续,并且以T为基本单位


来看D答案 : char *a [ 10 ]
里面的10指的是10个T类型的指针,
而typedef char T[10] 里面的10指的是10个char数值
 两个10之间没啥关系就  
T *a也没有告诉我们就必须申请10个指向T类型的指针
T *a只是告诉我们声明了一个a指针,指向一片地方,这片地方都是T类型的数据而已
这就像是int *a = new int[],
我们有一个指针a,以int类型为单位移动 int默认4字节移动(32位cpu)
只不过这里T是默认10个字节移动


B答案: char ( *a) [ 10 ] ; (大写A改成小写)
声明了一个指针,指针每次移动都是以T为单位的 ,符合!


***********************
// edition 1
typedef char T[10];

int main() {
    T *a;
    char (*b)[10];
    a = b;
}
************************
// edition 2
typedef char T[10];

int main() {
    T *a;
    char *b[10];
    a = b;
}
***********************

大家来验证一下上面哪个可以编译成功
编辑于 2015-04-14 16:45:45 回复(0)
很多人包括我,总是被这些数组指针和指针数组搞混,以前会了过段时间却又忘了,余不才提供一种方法:理清楚数组符号[]和谁搭配,就容易搞懂这些问题了。
比如char a[10],char和[10]搭配,意思是10个字符长的字符数组,a就是一个这样的字符数组。
那么char *a[10]呢?char*是字符指针,char*和[10]搭在一起,意思是10个字符指针长的字符指针数组,a就是这样一个字符指针数组。
而char(*a)[10]呢?因为有括号,*是和a结合在一起,而char是和[10]在一起,则是10个字符长的字符数组,*a是这样的一个字符数组,也就是说a是指向这样一个字符数组的指针。

typedef  char T[10]呢?char和[10]搭在一起,意思是10个字符长的一个数组,typedef定义了T是char[10]这样的一种数据类型。
T * a;*应该和a搭在一起,所以a就是指向T这样一种数据类型的指针,所以等价于char (*a)[10]
编辑于 2018-04-18 20:58:20 回复(22)
typedef char T[10] ;
T * a ; 
这里T是什么类型呢,把名字抹去不就是类型了吗?char [10],T为一个char数组。
那么T * a中啊为什么类型呢,T * ,T为数组,是一个整体,a为指向这个数组的一个指针喽。
也就是a为指向一个是个元素的数组的指针。
首先,a是指针,不是数组,然后a是数组指针,不仅仅是指针。所以A,C排除了。那么剩下两项B,D.
char (*a) [10] ; 
char *a [10] ;
这里就是一个优先级的问题了,[]优先级要高于解引用运算符。所以第一个a为指针,指向具有十个char元素的指针。
第二个为数组,每个元素都是指针,每个指针指向一个char变量。
这就是函数指针和函数也有类似的问题。分析优先级即可游刃而解。
发表于 2015-08-29 14:49:25 回复(1)
这题有问题吧

发表于 2015-07-03 17:15:00 回复(0)
我这么理解:
int a,*b;b是一个指向整型的指针。
那么T *a,a应该是一个指针,指向T类型。所以a应该是一个指向字符数组的指针,也就是数组指针。
数组指针的定义是:char (*a)[10];
发表于 2019-08-01 10:01:26 回复(1)
typedef char T[10]  的意思是 T为包含10个char元素的数组,是一个数组
T * a;就是指a为指向T类型的指针,是指针,即指向包含10个char元素数组的指针
接下来看选项(根据运算符优先级以及C++ Primer 中P53和P103介绍的“从里向外,从右向左”的方法解析一层层变量)
A和C比较基础,就不说了
主要是B和D容易混淆
B---首先看括号里,便可知道a是一个指针,外边是一个数组,即指向数组的指针,与题意相符
D---根据运算符优先级,a为数组,数组元素类型为指向char的指针,即指针的数组
发表于 2018-05-20 21:32:44 回复(0)
教大家怎么看这种:

首先是typedef,我们把这个T看成变量的声明,声明过后T的类型是什么,T就是什么。比如char T[10];那T的类型就是char[10];

然后看下面,T *a就和int *a一样,是一个指针,指向T的指针(也就是指向char[10]的指针)

发表于 2022-04-08 18:15:58 回复(0)
T*a;是某类型指针,T是数组,所以是数组指针。故,B
发表于 2019-09-05 10:07:08 回复(0)

数组指针 char (*a)[10]

指针数组 char *a[10]

发表于 2018-10-07 13:14:00 回复(0)

很简单,首先不看T,*a的定义表明a是一个指针,再看T是一个数组,因此合起来就是数组指针。

发表于 2017-04-17 22:31:45 回复(0)

非常简单
这道题等价于

char a[10];

然后问你&a的类型是什么

发表于 2023-11-01 20:43:04 回复(0)
指包含10个char元素的指针,也就是指针数组
发表于 2023-07-31 17:07:17 回复(0)
typedef是把那个替换标示看做一个整体,自带括号,#define仅仅是字符串替换
发表于 2022-09-29 11:00:30 回复(0)
虽然我觉得这题很怪,但是有一个想法,如果不考虑t的类型,那a的类型应该说一个指针,指向t类型,选项里找指针就好了
发表于 2021-08-03 16:42:43 回复(0)
记得一句话,有括号是指针。数组指针 int (*a)[20] 。 没括号是指针数组  int *a[20] 
发表于 2021-03-25 13:57:28 回复(1)
例如:typedef int INT; INT a; 那么:直接用a替换第一行的INT得到: int a; 同理:typedef char T[10]; T *a; 替换:char *a[10];
发表于 2017-03-22 08:40:35 回复(0)
如果是#define 的话,直接替换,选D,这里是typedef是一种数据类型char [10]的别称,是一个字符数组,而变量名是一个指针,指向这个数组,所以是数组指针,不是指针数组
发表于 2017-03-18 23:59:50 回复(0)
type def不是简单替换, 这里声明的 T*理解为指向T类型的指针, 选B
发表于 2016-10-07 15:15:09 回复(0)
a是指针
发表于 2016-10-06 19:24:39 回复(0)
先定义数组,再定义指针,故指针是数组的指针。
发表于 2016-05-23 15:48:24 回复(0)
a的类型是数组指针
发表于 2015-12-31 14:17:41 回复(0)