const char str1[] 与 const char * stra
const char str1[] = "abc";
const char str2[] = "abc";
const char * stra = "abc";
const char * strb = "abc";
请问 str1==str2 比较的是什么,还有stra==strb比较的又是什么,stra==strb为什么相当于strcmp(stra,strb)==0
实在迷惑了,哪位能解释一下吗,非常感谢!
[解决办法]
指针相等,意味着两个指针指向了相同的一块内存区域,也即是两个指针指向了同一个目标(字符串),同一个字符串,strcmp自然是相等的。
[解决办法]
两个都是比较指针,如果stra == strb 为真时,则它们指向同一个字符串,和strcmp(stra,strb) == 0 是一样的
[解决办法]
请问 str1==str2 比较的是什么,还有stra==strb比较的又是什么,stra==strb为什么相当于strcmp(stra,strb)==0
st1==str2比较的是两个字符数组的起始地址。stra==strb比较的是字符串的地址。为什么stra==strb成立,因为stra,strb指向的是字符串常量。这两个字符串经过编译器优化后就只有一个了。所以stra,strb指向的是同一个字符串。自然字符串的地址就只有一个了。
[解决办法]
这些问题还是来自于书中,建议看《C和指针》,来回看个两遍,这些都懂了
[解决办法]
str1 == str2想等说明指向地址相同
[解决办法]
lz 首先要明白
const char str2[] = "abc"; // 一维字符数组,4个元素,分别是 'a', 'b', 'c', '\0'
const char * stra = "abc"; // 一个指向字符串的指针,并用字符常量初始化,在大部分的实现中,
字符常量位于常量区,而且只有一个实例
[解决办法]
这两种实际上都是比较指针,
数据段只有一个"abc"字符串,
str1与str2会在栈中开辟新地址,并把"abc"的内容拷贝到新地址。
正因为都是开辟新地址,所以它们并不相等。
stra与strb里存储的直接是数据段里"abc"字符串的地址,
所以它们相等。
#include <stdio.h>
int main()
{
const char str1[] = "abc";
const char str2[] = "abc";
const char* stra = "abc";
const char* strb = "abc";
return 0;
}
编译后得到的汇编代码:
.file"demo.cpp"
.def___main;.scl2;.type32;.endef
.section .rdata,"dr"
LC0:
.ascii "abc\0"
.text
.globl _main
.def_main;.scl2;.type32;.endef
_main:
pushl%ebp
movl%esp, %ebp
andl$-16, %esp
subl$16, %esp
call___main
movlLC0, %eax
movl%eax, 4(%esp) #这行与上面一行表示将LC0地址中的内容(即"abc\0")复制到4(%esp)地址
movlLC0, %eax
movl%eax, (%esp)
movl$LC0, 12(%esp) #将LC0本身(即一个地址)作为常量复制到12(%esp)
movl$LC0, 8(%esp)
movl$0, %eax
leave
ret
其中LC0就是"abc\0"的地址,$LC0表示直接将LC0这个地址值作为一个常量。
[解决办法]
str1, st2 数组名进行比较,转换为 指针常量,
数组1,数组2中的内容存在栈中。。。。。
各自的栈,不会相等的。。。
对于字符串而言。。。。。
楼上说了,编译器优化的问题。
你提供的字符串 ,stra,strb是两个常量指针进行比较
[解决办法]
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、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!