有一个题目: 设"int x[]={1,2,3,4,5},p=x;"则值为3的表达式是:p+=2,p++ p不是代表指向地址吗,如何可以直接进行加减,而后
有一个题目: 设"int x[]={1,2,3,4,5},*p=x;",则值为3的表达式是:p+=2,*p++ p不是代表指向地址吗,怎么可以直接进行加减,而后
有一个题目:
设"int x[]={1,2,3,4,5},*p=x;",则值为3的表达式是:p+=2,*p++
p不是代表指向地址吗,怎么可以直接进行加减,而后面的*p++却要加*
------解决方案--------------------
指针值是地址数值,但指针不是地址。C语言里本来就定义了指针的加减法,你可以去看看书上相关的章节。
*是取指针所指位置内容的算符,也在指针的章节里介绍的。
------解决方案--------------------
写在里面是C++的语法里才有的,C不支持这样的语法。
------解决方案--------------------
首先指针是一个变量,它有自己的地址,但是它的值不是我们常见的数值,而是一个指向另外一个内存的地址!
变量当然能进行加减了!
int arr[3]={1,2,3};
这里arr是一个地址常量,是数组首元素的地址,注意是一个常量,所以不能加减!
举个例子,我也不知道形象不形象,呵呵。。。
你家地址是 street 10,这个数就定下来了,就是你家地址,改了这个数那么你家怎么办!对吧
好,现在我要写一封信,寄到地址为street 10的地方,那么这个就是一个变量了,修改一下,改为street 11
那么这封信就寄到你家隔壁去了! 现在你家地址还是street 10,是不会改变的!
懂了吗?
------解决方案--------------------
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”
提醒:
“学习用汇编语言写程序”
和
“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
有一个题目:
设"int x[]={1,2,3,4,5},*p=x;",则值为3的表达式是:p+=2,*p++
p不是代表指向地址吗,怎么可以直接进行加减,而后面的*p++却要加*
------解决方案--------------------
指针值是地址数值,但指针不是地址。C语言里本来就定义了指针的加减法,你可以去看看书上相关的章节。
*是取指针所指位置内容的算符,也在指针的章节里介绍的。
------解决方案--------------------
写在里面是C++的语法里才有的,C不支持这样的语法。
------解决方案--------------------
首先指针是一个变量,它有自己的地址,但是它的值不是我们常见的数值,而是一个指向另外一个内存的地址!
变量当然能进行加减了!
int arr[3]={1,2,3};
这里arr是一个地址常量,是数组首元素的地址,注意是一个常量,所以不能加减!
举个例子,我也不知道形象不形象,呵呵。。。
你家地址是 street 10,这个数就定下来了,就是你家地址,改了这个数那么你家怎么办!对吧
好,现在我要写一封信,寄到地址为street 10的地方,那么这个就是一个变量了,修改一下,改为street 11
那么这封信就寄到你家隔壁去了! 现在你家地址还是street 10,是不会改变的!
懂了吗?
------解决方案--------------------
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”
提醒:
“学习用汇编语言写程序”
和
“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!