char数组,指针的差异是什么

char数组,指针的区别是什么?
一道考研题:
以下语法存在错误的是:
A. char *s[]={"right?"};
B. char s[][20]={"right?"};
C. char *s[6];s[1]="right?";
D. char s[6][20];s[1]="right?";
==================================
答案:D

追问:char s[],char *ptr,char *s[]
他们之间的区别是什么呢?
虽然问这个有点可笑。。。但作为初学者还是虚心求教。。。

------解决方案--------------------
C/C++ code
//C/C++中没有多维数组
char s[6][20];//s为6个元素的数组,每个元素为 char [20]的数组
//s[1]的类型为数组,所以不能用另一个数组("right?")来复制. 

//类似以下代码:
char a[9];
char b[] = "ehllo";
a = b; //error

------解决方案--------------------
探讨

C/C++ code
//C/C++中没有多维数组
char s[6][20];//s为6个元素的数组,每个元素为 char [20]的数组
//s[1]的类型为数组,所以不能用另一个数组("right?")来复制.

//类似以下代码:
char a[9];
char b[] = "ehllo";
a = b; //error

------解决方案--------------------
char s[],一个数组
char *ptr,一个指针
char *s[]指针数组,数组的每一个元素是一个指针

char s[6][20];s[1]="right?";数组没法这么赋值

就像int a[];a = {1, 2, 3}这样不行一样。

lz可以看一下书数组是如何初始化,以及初始化的方式有多少种
对与数组可以int a[] = {1, 2, 3};
也可以循环赋值a[i] = 数值;
但是不能那a当做左值, a=什么,这些都是错的。

然而指针是可以当做左值的,可以被赋值。

你要懂得char *s[],和char (*s)[]的区别。
前者是指针数组,后者是数组指针

int *p[2]; 首先声明了一个数组,数组的元素是int型的指针。
int (*p)[2]; 声明了一个指针, 指向了一个有两个int元素的数组。

------解决方案--------------------
如果是函数入参的 话 ,char s1[]和 char *s2 没区别,编译的时候 都是一个指针而已
但是在定义的时候,还是有区别的,
如果 定义了 char *s2 = "listentotime";
那么你是无法给S所指的空间里赋值的,也就是说你无法用 s[5] = 'k'; 把原来的字符串变成listektotime的。因为编译器不允许(仅仅是编译器不允许而已,绕过编译器也是可以乱来的)。
如果定义了 char s1[] = "listentotime"; 实际上就是相当于一个普通的char数组。是允许修改的。

至于char *s3[]
举个例子
假如声明了char *s[5];
也就是声明了5个char指针,相当于前面举例的5个 char *s2;其中 s3[i]的 用法和 前面的s2一模一样。
------解决方案--------------------
除了声明时 出现在左面赋值 左边都为指针
------解决方案--------------------
探讨

char s[],一个数组
char *ptr,一个指针
char *s[]指针数组,数组的每一个元素是一个指针

char s[6][20];s[1]="right?";数组没法这么赋值

就像int a[];a = {1, 2, 3}这样不行一样。

lz可以看一下书数组是如何初始化,以及初始化的方式有多少种
对与数组可以int a[] = {1, 2, 3};
也可以循……

------解决方案--------------------
考察的是数组初始化以及数组和指针的联系及区别。