C语言,指针问题,为什么输出结果是3,求高手帮忙分析分析,最好详细点说,谢谢!!

#include<stdio.h>
#include<stdlib.h>
int main()
{
const char *p="ABCDE";
const char **q=&p;
*q="12345";
const char *s=(++p)++;
p="abcde";
printf("%c\n",*++s);
system("pause");
return 0;
}

第1个回答  2012-11-19
const char **q=&p的意思就是*q=p,那么*q="12345"的实质就是p="12345",现在是p指向1;const char *s=(++p)++是s=p+1的意思,后面那个++给s赋值时不起作用,那就是s指向了2;printf("%c\n",*++s)是要输出s+1的内容(++在s前要先加1),那自然是3了。追问

你好,谢谢您的耐心解答!
还有些问题想问下您:
(1)为什么说“const char **q=&p; 推出 *q 和 p 相同”,怎么推出的啊,二级指针学的不怎么好,纠结!
(2)这个程序中反复用到const这个关键字,const在这里起到什么作用,而且const不是定义只读的变量吗?为什么p开始指向“ABCDE”,然后又指向“12345”,最后又指向“abcde”?只读的指针p为什么还可以不断修改??

追答

1.你只要知道定义指针时前面的*和引用指针时前面的*不是一个意思就明白了:const char **q=&p中的两个**说明q是指针的指针,而&p是说把p的地址取出来(就是p的指针啊),中间的=是说把p的地址赋给指针的指针**q。而引用时*q="12345"中的*是取q的内容,q是双层指针,取一层还是指针,而这一层是指向p的指针,取它的内窗帘容不就是p吗?这太绕了,可能你还没有明白,哈哈……
2.const放在类型符char、int等前声明的指针,是说该指针指向的变量是只读的,不能改写,而它自身的指向是可以改变的。要达到你说的目的,const要放在类型符后,如char const *p=&a,那p就不能再指向别处了,可是变量a的值却可以改变。要想都不可改变,那得写两个const,如const char const *p=&b,那p和b就都不可改变了……

追问

谢谢,说的很详细啊!第二点关于const的懂了,第一个确实太绕了,指针确实有点难懂,我大概说下我的理解吧,你帮忙看下对不对,谢谢啦!
关于第一点,看了你上面说的,const char **q=&p;这条语句是不是等价于const char **q;q=&p啊???
然后&p就是取p的地址,也就相当于p的指针,q=&p左右两边同时做指针运算,得到*q=p,之后再根据*q="12345"得到p由指向“ABCDE”改为指向“12345”,然后…字数有限,写不下,是这样吗?

追答

OK.

追问

呵呵,谢谢,不好意思,再次问下:const char **q=&p;和const char **q;q=&p;不等价吗??楼上那位哥们说不等价,我都弄糊涂了!

追答

你把const char **q=&p改成const char **q;q=&p;printf("%p %p\n",*q,p),然后执行,看两个指针是否相等,且还是否输出3不就什么都清楚了?

追问

额,谢谢提醒,是了下,运行结果不变,还是3,谢谢你了!

第2个回答  2012-11-19
const char **q=&p; -- *q 和 p 相同。p=ABCDE *q=ABCDE

*q="12345"; -- p=12345

const char *s=(++p)++; s 指向 p[1], 就是"2"

p="abcde"; -- p 变化不影响 s

printf("%c\n",*++s); -- s 先加1个位置再输出,所以指向 p[2], 就是 "3".追问

你好,谢谢您的耐心解答!
还有些问题想问下您:
(1)为什么说“const char **q=&p; 推出 *q 和 p 相同”,怎么推出的啊,二级指针学的不怎么好,纠结!
(2)这个程序中反复用到const这个关键字,const在这里起到什么作用,而且const不是定义只读的变量吗?为什么p开始指向“ABCDE”,然后又指向“12345”,最后又指向“abcde”?只读的指针p为什么还可以不断修改??

追答

const 指指针地址const, 它们指向的值 不是不可以变。值可以不断修改。

**q 和 *p 对应, *q 和 p 对应。

追问

还是想问下:你这里的**q对应*p怎么来的啊?是根据q=&p,然后**q=**(&p)=*p得来的吗?还是??
还有就是const char *p;这条语句定义的是一个指向字符串常量的指针,字符串常量的值不能变,指针可以变,是说指针指向的字符串常量可以改变吗?

追答

**q对应*p , 根据 char *p; 和 **q=&p;
**q 是1个指针(指向指针的指针而已,是1个指针)。*p 也是1个指针。

你自己试验一下:
p="abcde";
p="54321";
看看如何。指向的字符串常量,允许改变的啊!

追问

额,谢谢!!
再问个小问题:const char **q=&p;这条语句是不是等价于const char **q;q=&p啊???

追答

不等于。
声明是声明,语句是语句。
c语言,形式逻辑不成立。

追问

什么意思啊?const char **q=&p;和const char **q;q=&p;不等价??为什么啊?

追答

形式逻辑不成立 -- 外貌相同写法,含义不同。

例如 int *p; 语句里可以写 *p=5; 声明里不可以写 int *p=5; 含义不同。一是值,一是地址。

你再追问,“百度知道”要扣我的分了。

追问

呵呵,扣点分算什么啊,大不了我给你啊!
但是我把const char **q=&p;改成const char **q;q=&p;运行结果完全一样啊!!
还有就是这里的q=&p两边都是地址啊,没有哪个是值吧

追答

语句中 &p 是地址,只有当 p 是 char p; 才对。
声明 char *p; 语句中 &p 是什么呢?

追问

这里的p就是字符指针型啊

追答

声明 char *p; p是字符指针。 语句中 没有 &p 型式的写法。
声明 char p; 语句中 可以有 &p 型式的写法。p不是字符指针。
声明 char p; 语句中 没有 *p 型式的写法。p不是字符指针。
分清什么叫 “声明”,什么叫 “语句”。
c++ 的引用,c/c++ 按位与运算 不在讨论之列。

追问

这个有点糊涂了,没必要分这么清楚吧,不管声明是怎么样的,对于任何一个变量。都可以用取地址运算符&对取该变量的地址吧,也就是上面说的&p
说实话,我没太明白你上面的意思,你说声明 char *p; p是字符指针。 语句中 没有 &p 型式的写法。但是就上面的程序中
const char *p="ABCDE";
const char **q=&p;
这两句,声明中也没&p啊,但是第二句还是用了&p

追答

C语言,语句中声明中写法一样,意思会不一样。例如,声明中 *p 叫指针,语句中 *p 是值。
const char **q=&p; 这是声明和初始化。
------------------------------------------------------
char *p="ABCDE"; //声明
char **q; //声明
q= (char **) p; //语句
分清什么是声明,什么是语句,对理解程序意义是重要的。当然你觉得没必要,也不是不可以。

本回答被网友采纳

求C语言高手帮忙分析代码
当您寻求代码分析帮助时,关键在于清楚地描述问题和代码背景。首先,确保您提供了完整的代码段,避免只给出部分代码或不完整的片段。其次,明确指出您遇到的困难或需要解决的问题,比如特定的错误信息、预期结果与实际结果之间的差异或代码功能的疑问。使用具体示例来说明您遇到的具体情况,这样能帮助分析者更...

两道c语言编程,能不能帮忙分析一下结果为什么不同?
第一道:因为STU中的char *name声明的name是个指针,当b=a操作后b就是a的拷贝,指针name被拷贝后仍然指向同一个地方,所以对name指向的目标值是最后一次操作的结果。这就就像int x=3,*p1=&x,*p2=p1;*p2=10;结果因为x=10了,所以*p1也就是10。其他值的改变使a与b不同好理解不赘述。所以结...

求高手大师帮忙解答
8、正官为忌神,有骄傲刚愎的现象但临事又优柔寡断,或缺乏责任感,(在领导、老板或头面人物面前有恭维好表现之倾向,对下属或别人的承诺,有难于兑现和落实之处;否则,容易误会),法纪观念淡薄(实践中,部分专家发现,分析出不少命例有胆大妄为的心理活动和投机取巧的冒险行为趋向来,个别命例有侥幸思维和成功的事例)。

请高手帮忙分析下命盘~~,越详细越好!谢谢!
先天上,您的事业运势以「爽朗」的特质最为突显,也就是说,较能符合您个性的是具公益或人际性质的行业,例如社会服务、政治、司法、文化教育、民间团体、大众传播等,会比较能够引起您的兴趣,刺激您的工作意愿,或者是声誉良好的外商,例如资讯、电子、交通运输、金融、保险的国际企业等。 由於出外运势为凶,出外的危险...

如何学好C语言?
《C语言参考手册》就是《C Reference Manual》,是C语言标准的详细描述,包括绝大多数C标准库函数的细节,算得上是最好的标准C语言的工具书。顺便提一句,最新的《C程序设计语言》是根据C89标准修订的,而《C语言参考手册》描述的是C99标准,二者可能会有些出入,建议按照C99标准学习。还有一本《C和指针》,写得也是...

跪求好心人帮忙解答一些英语语法题,要详细解释分析~~~急急急=3=
3.rise主要指是自然物的升高比如:太阳的升起,涨水,月亮的升起,价格的上涨等等。raise主要指:举起什么,抬高什么,有主语发出的动作 4.B翻译过来解释不通啊。C“直到”语态前后冲突 5.progress是不可数名词“进展”所以用单数,这里has 和 did 不是表示完成时和过去时,而是never 放在句首要用...

如何学习C语言
第三:很多新型的语言都是衍生自C语言,C++,Java,C#,J#,perl...哪个不是呢?掌握了C语言,可以说你就掌握了很多门语言,经过简单的学习,你就可以用这些新型的语言去开发了,这个再一次验证了C语言是程序设计的重要基础。还有啊,多说一点:即使现在招聘程序员,考试都是考C语言,你想加入it行业,那么就一定要掌握好C...

文件系统格式问题 计算机高手请帮忙 (高分酬谢)
3. 是否有安全性方面的考虑等。基于以上的考虑,如果要在Win 2000中使用大于32GB的分区的话,那么只能选择NTFS格式。如果计算机作为单机使用,不需要考虑安全性方面的问题,更多地注重与Win 9X的兼容性,那么FAT32是最好的选择。如果计算机作为网络工作站或更多的追求系统的安全性,而且可以在单一的Win 2000模式下运行,强烈...

面试真题,求助高手:谈一件你最成功的事?
1、简单基本信息介绍 2、说出你适合这个岗位的理由 3、说出你选择这个公司的理由 说出适合这个岗位的理由,可以从自身掌握的技能和从事过的行业,项目,实习等工作经验入手。而对于选择这个公司的理由,可以简单概括一下对公司文化发展的理解,并表示自己入职的诚意与期待。二,最难回答的问题总结 问:谈谈...

c语言的重要性是什么
目前最著名、最有影响、应用最广泛的windows、linux和UNIX三个操作系统都是用C语言编写的。0S是计算机系统(由软硬件两个子系统构成)的核心和灵魂,它是软件中最庞大最复杂的系统软件。既然如此庞大复杂的0S都可以用c语言编写,从狭义而言,还有什么系统软件和应用软件不能用c语言编写呢?由此可以肯定的说,c语言是一门...

相似回答