p = s不合法的原因是:s 在表达式中通常会被转换为指向其第一个元素的指针,即指向 s[0](第一个一维数组)的指针,其类型为 char (*)[10]。但 p是一个char *,指向单个字符。
p = k不合法的原因是:k 是一个指向具有3个元素的字符数组的指针,其类型为 char (*)[3]。尝试将 k 赋值给 p 会导致类型不匹配,因为char (*)[3](指向3个字符数组的指针)不能隐式转换为 char *(指向单个字符的指针)。
p = s[0]合法的原因是:s[0] 是二维数组 s 的第一个元素,它是一个具有10个字符的一维数组。在表达式中,s[0] 会被转换为指向其第一个元素的指针,即 &s[0][0],其类型为 char *。因此,这个赋值是合法的,p 指向 s[0] 的第一个字符。
k = s不合法的原因是:s 是一个二维数组名,它在表达式中会被转换为指向其第一个元素的指针,即 &s[0],其类型为 char (*)[10]。但是,k 是一个 char (*)[3] 类型的指针,指向一个具有3个元素的字符数组。尽管 s 和 k 都指向数组,但由于数组的列数不同(10 vs 3),这个赋值是不合法的。