已知char **s;下面正确语句是()A,s="ABCDEF";B,*s="ABCDEF";C,**s="ABCDEF";D,*s='A'
求解,求解释【解析】“s”是代表数组首地址的地址常量,不是变量,“=”左边不能出现常量,因此s="ABCDEF"语法错误。“**s”和“s”一样;“*s”是指变量地址,不...
求解,求解释
【解析】“s”是代表数组首地址的地址常量,不是变量,“=”左边不能出现常量,因此s="ABCDEF"语法错误。“**s”和“s”一样;“*s”是指变量地址,不能给其赋字符串。
答案是说C
看了依旧不懂! 展开
【解析】“s”是代表数组首地址的地址常量,不是变量,“=”左边不能出现常量,因此s="ABCDEF"语法错误。“**s”和“s”一样;“*s”是指变量地址,不能给其赋字符串。
答案是说C
看了依旧不懂! 展开
4个回答
展开全部
首先你理解错了,指针可以赋值的,它是指向了一个常量地址,但它自己是变量
然后 在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
展开全部
解析太逗了。
首先要弄清楚类型。
s的类型是char**
*s的类型是char*
**s的类型是char
字符串字面量的类型是char*
字符常量的类型是char。
假设s和*s已经指向正确的位置,那么
A:char**和char*不能隐式转换。
B:两边均为char*型。正确。
C:char和char*不能隐式转换。
D:char*和char不能隐式转换。
故正确答案是B。
首先要弄清楚类型。
s的类型是char**
*s的类型是char*
**s的类型是char
字符串字面量的类型是char*
字符常量的类型是char。
假设s和*s已经指向正确的位置,那么
A:char**和char*不能隐式转换。
B:两边均为char*型。正确。
C:char和char*不能隐式转换。
D:char*和char不能隐式转换。
故正确答案是B。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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;
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
*s只是一个char型指针变量,是可以赋值更改的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询