已知char **s;下面正确语句是()A,s="ABCDEF";B,*s="ABCDEF";C,**s="ABCDEF";D,*s='A'

求解,求解释
【解析】“s”是代表数组首地址的地址常量,不是变量,“=”左边不能出现常量,因此s="ABCDEF"语法错误。“**s”和“s”一样;“*s”是指变量地址,不能给其赋字符串。
答案是说C
看了依旧不懂!

首先你理解错了,指针可以赋值的,它是指向了一个常量地址,但它自己是变量

然后 在C语言中字符串是有值的,但它的值不是这一串字符,它的值是一个常指针,相当于const char*

就上面的题举例:
如果在内存中
地址 : 10进制值
0001: 65    相当于'A'
0002: 66    'B'
0003: 67    'C'
0004: 68    'D'
0005: 69    'E'
0006: 70    'F'
0007: 0      字符串结尾
0123: ??     比如说char **s就存在这里
那么 "ABCDEF" 的值就是这个字符串的起始位置0001,类型可以理解成const char *(不过有区别,因为这里的ABCDEF是存在代码段里的,棸体可以自行百度,也可以私我)

A,s="ABCDEF";    //char**=char*,错误   此时s=0001,那么*s=65,类型为char *,这时**s就取了地址为65的一个未知的值
B,*s="ABCDEF";    //char *=char * ,匹配,正确   但这只是编译上正确,很容易出逻辑错误,因为在这名之前如果s没有正确地赋值,如果s==0,那么*s就会在运行时出错,又如果s==0001,那么*s就访问了无权访问的内存(代码段),运行时也会出错,所以在这句之前最好有类似char *p;    s=&p; 这样的初始化
C,**s="ABCDEF";    //char = char * 错误  编译错误,以及和B选项类似的错误
D,*s='A'            //char *=char   错误     结果和A类似

学校考试的话,答案应该是B

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-08-31
解析太逗了。
首先要弄清楚类型。
s的类型是char**
*s的类型是char*
**s的类型是char
字符串字面量的类型是char*
字符常量的类型是char。
假设s和*s已经指向正确的位置,那么
A:char**和char*不能隐式转换。
B:两边均为char*型。正确。
C:char和char*不能隐式转换。
D:char*和char不能隐式转换。
故正确答案是B。
第2个回答  2013-08-31

B  才是对的吧  不考虑类型强转并且 在此前有 s=new char*;

typedef char * pchar;

pchar *s;

 s可以看成以上定义 也许更方便理解

 

typeid("ABCDEF").name()是const char [7];

typeid(*s).name()是char *;

typeid(**s).name()是char;

如果考虑强转  可以参考如下

s=new char **;//s=(char **)(void*)("ABCDEF");

 

*s=new char *;//**s=(char)(long)(void*)("ABCDEF");

//*s=(char*)(long)('A');

如下操作经过VS2010 测试

char **s,**ppt,*pt,p;
  cout<<"**s:"<<typeid(**s).name()<<endl;
  cout<<"*s:"<<typeid(*s).name()<<endl;
  cout<<"s:"<<typeid(s).name()<<endl;
  cout<<"\"ABCDEF\":"<<typeid("ABCDEF").name()<<endl;
  s=ppt=new char*;
  *s=pt=new char ;
  **s=p='A';
  **s=(char)(long)(void*)"A";
  *s=(char*)(long)'a';
  *s="B";
  s=(char **)(void *)"C";
  s=(char**)(void*)(long)'d';
  delete ppt;
  delete pt;

本回答被提问者和网友采纳
第3个回答  2013-08-31
*s只是一个char型指针变量,是可以赋值更改的。