C语言字符串二维数组引用可以省略列下标吗?

char name[5][10]; 以正确赋值引用时可不可以用name[0]表示name[0][0]到name[0][9]用name[4]表示name[4][0]到name[4][9]

图中的源程序对char name[5][10]的引用是不是错误

代码语法上是没有问题的。
(1)c语言的二维数组的每一行都可以看成一个一维数组,如书上的name就可以看成5个一维数组组成的。如果数组恰好定义成char类型,那这些一维数组又可以看成字符串。
(2)代码一开始就是用strcpy函数对这5个字符串赋值。每行的大小只有10个字节,因此它还要检测输入是否越界。老师应该说过,c字符串的结尾要有个结束符0,所以这里的检测直觉上是有问题的,>10改成>=10更好一些。
(3)访问这些一维数组最直接的方法就是书上的做法。name[i]的意思就是第i行的起始地址。在vs编译器上还允许
char *p = name[i];
char (*p)[10] = &name[i];
char (*p)[10] = (char (*)[10])name[i];
可能有些编译器不完全支持追问

是不是只有字符数组可以这样用

追答

这是通用法则,你可以换成int试着访问其中的某些元素。例子很多,搜索一下

追问

字符数组可这样做,我可以理解因为有结束符0存在
数据数组这样做有什么意义,数据数组有没有结束符他是如何确定范围的。
搜索用什么关键词?

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-12-05
不可以这样引用,但可以用数组指针来实现,如下:
char (*np)[10];
np = name;
按上述声明:
*(np + 0)表示name[0][0]到name[0][9]
*(np + 1)表示name[0][0]到name[0][9]追问

可以用name【0】表示name【0】【0】吗

追答

不可以的。要用到数组指针运算。

追问

图中的源程序对char name[5][10]的引用是不是错误

追答

书上没错。你把name[0]看作char*的指针,题中相当于指向一个字符串,就容易理解了。
name[0]是name[0][0]~name[0][9]这一列的首地址,也是指一个字符串的开头。
name[0][0]到name[0][9]相当于一段内存存放了10个char型数据,name[0][0]是第一个数据,而name[0]存放着第一个数据所在的地址,即:name[0] 和 &name[0][0]相等。
name[0]无法表示name[0][0],不加下标,只能采用指针方式访问:**name即name[0][0],*(*name+1)即name[0][1]……以此类推。

追问

是不是只有字符数组可以这样用

追答

字符数组存放字符串以'\0'结尾,可以这样用。

其它情况下,需要同时传入长度,不能直接给一个name[0]。
比如double d[5][10],函数为add(double* p)时,写add(d[0])没错,但add只会读取d[0][0],因为它不知道后面还有些什么。

本回答被提问者采纳
第2个回答  2019-12-05
C语言引用时可以省略第一个下标,但不能省略第二个。
第3个回答  2019-12-05
省略列下标后就表示一个char*类型的地址(就是对应行的列下标为0的元素的地址)了,只能赋值给char*类型的指针(除了强制转外)。
即:
如有char name[5][10];
则char *p=name[0];可以,
p=name[4];也可以。追问

图中的源程序对char name[5][10]的引用是不是错误

追答

没错。strcpy,strcmp函数需要一个char*类型的指针,而name[i]刚好是(看前面我的分析就知道了)。

本回答被网友采纳
第4个回答  2020-01-07
敲一次代码就知道