你把数组名和指针混淆了。
数组名和指针,使用形式上,除了数组名不允许被赋值以外,其他形式是完全相同的
根本上来讲,数组名不仅不许被赋值,就连类型名都不同。
int a[4],*p;
p=a;
从p=a执行完毕以后,任何时候,用随时可以把a和p进行替换(例外就是p可以被赋值,a不行)
但是,a的类型是int [4],p的类型是int*。
如果是应付考试的话,类型不同这段不用考虑了。
===========================
确实选D
str[1]是数组名,下属10个元素,对应str[1][0]~~str[1][9],数组名,不许被赋值
更多追问追答
追问
哦,这个字符型的二维数组,它的str[0],str[1],str[2]是每一行的行指针,比如str[1]这个行指针,就指向str[1][0]~str[1][9]这10个元素它也是这10个元素的数组名,它是常量,不能被赋值,而不能简简单单的认为它是一个char型的,即使是int型的也不能这样做是吧
那我要是想让str[1]这个字符串指向“guest"这个串,应该怎样写呢?
追答
停停停停停
行指针?谁告诉你二维数组中一维形式是行指针的?
行指针,行指针,看名字就知道那是指针变量,能赋值的。
我就说你把数组名和指针混淆了
char str[3][10]
定义是数组str,具有三个元素,这三个元素的名字分别是str[0]、str[1]、str[2],类型都是char [10],而通过类型是char [10]这一点看得出,str[0]、str[1]、str[2]虽然是数组元素,但本质上依旧是一个数组名。
这里我刻意忽略了一维二维的称呼。
str[0]、str[1]、str[2]是数组名,不是指针,str也不是指针,也是数组名
关于行指针,最后说一句,既然名字都叫行指针了,char型的行指针,定义时的类型名必然是char *[],你这个题4个选项里面,就没有一个是行指针的。
追问
嗯嗯
行指针只能是str+0 str+1 str+2咯
str[0] str[1] str[2]是每行的数组名 它是常量
它指向每个首元素的首地址?
追答
差不多。
很多人把指针和指针变量混淆了。指针就是地址编号,内存中每个字节的编号,同时还要考虑其类型。指针变量是用来存储指针的变量,二级指针看名字高大上,其本质依旧是个存储指针的变量,只不过要求必须是一级指针变量的指针,也就是一级指针变量的地址。
str+0 str+1 str+2是指针,指向二维数组每“行”起始位置,同时数值每次+1,都是移动二维数组的一整“行”
同时 char (*q)[10]是行指针变量,每次+1,移动10个char型,对应D选项中的数组,也是一“行”
str[0] str[1] str[2]是一位数组名,不是指针,虽然用法上跟指针几乎没区别,但数组就是数组,类型名上就看得出,根本不一样。但他们三个指向每行的首元素,值是每行首元素的首地址。之所以这么说,是因为考虑到二维数组不仅有char,还有int等其他最低级元素所占字节数大于1的类型。
还有,我上面说的行都是加引号的,因为二维数组的本质是一种特殊的一维数组
一般课本上关于二维数组都会给两种图示画法,一种是二维表格形状的,这种读程序读起来方便,另一种是一字长蛇阵形式的,这种才是c眼中的二维数组,结合我下面这段话理解就明白了。
int a[3],这很明确不用说了
int a[3][4],也相当明确,定义了数组a,有3个元素,每个元素类型是int [4]也就是4个int构成的一维数组。
温馨提示:答案为网友推荐,仅供参考