const char str1[] 与 const char * stra

MoonlightDesigner 2012-02-05 02:27:28

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

实在迷惑了,哪位能解释一下吗,非常感谢!
...全文
241 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-02-06
  • 打赏
  • 举报
回复
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、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
程序员小迷 2012-02-06
  • 打赏
  • 举报
回复
记住,永远是指针的值
IVERS0N 2012-02-06
  • 打赏
  • 举报
回复
多看下书
heartszhang 2012-02-06
  • 打赏
  • 举报
回复
作为c++标准控,我用c++标准来回答你,

首先,

str1和str2是不同的,楼上有人解释过了,开辟了新地址,用来存储"abc"。

其次,我主要是说明 stra和strb,因为stra和strb都指向一个字符串"abc",表面上看stra和strb应该相等,但是实际上却不一定总是相等。

更浅白一点说,
char *stra = "abc";
char *strb = "abcd";
你可以看出stra和strb肯定不相等,因为他们指向了两个不同的字符串。

但是
char *stra = "abc";
char *strb = "abc";
stra和strb是否相等,其实取决于两个"abc"是否为同一个字符串。

而c++标准规定:这两个abc是否为同一个字符串,是编译器自定义行为,即有的编译器可能相同,有的编译器可能不相同。 (Whether all string literals are distinct (that is, are stored in nonoverlapping objects) is implementation defined.)

虽然绝大多数编译器都可以优化成同一个字符串,并不表示一定是这样。你的源代码最好也不要基于这种假设。

特别是当char *stra="abc"和char *strb = "abc"在两个不同文件的时候,有一些编译器在做链接的时候可能不会把这2个"abc"当成同一个字符串。


caddor 2012-02-05
  • 打赏
  • 举报
回复

str1, st2 数组名进行比较,转换为 指针常量,

数组1,数组2中的内容存在栈中。。。。。

各自的栈,不会相等的。。。

对于字符串而言。。。。。

楼上说了,编译器优化的问题。

你提供的字符串 ,stra,strb是两个常量指针进行比较



[Quote=引用楼主 ubuntu_ai 的回复:]
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

实在迷……
[/Quote]
mzlogin 2012-02-05
  • 打赏
  • 举报
回复

这两种实际上都是比较指针,
数据段只有一个"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; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC0:
.ascii "abc\0"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
call ___main
movl LC0, %eax
movl %eax, 4(%esp) #这行与上面一行表示将LC0地址中的内容(即"abc\0")复制到4(%esp)地址
movl LC0, %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这个地址值作为一个常量。
MoonlightDesigner 2012-02-05
  • 打赏
  • 举报
回复
看来C语言还是半桶水。。。。得要加点油了。。。。谢谢
MoonlightDesigner 2012-02-05
  • 打赏
  • 举报
回复
哦。。。原来如此,非常感谢各位的回答!
AnYidan 2012-02-05
  • 打赏
  • 举报
回复
lz 首先要明白
const char str2[] = "abc"; // 一维字符数组,4个元素,分别是 'a', 'b', 'c', '\0'

const char * stra = "abc"; // 一个指向字符串的指针,并用字符常量初始化,在大部分的实现中,
字符常量位于常量区,而且只有一个实例
ProgrammingRing 2012-02-05
  • 打赏
  • 举报
回复
str1 == str2想等说明指向地址相同
小班得瑞 2012-02-05
  • 打赏
  • 举报
回复
这些问题还是来自于书中,建议看《C和指针》,来回看个两遍,这些都懂了
pengzhixi 2012-02-05
  • 打赏
  • 举报
回复
请问 str1==str2 比较的是什么,还有stra==strb比较的又是什么,stra==strb为什么相当于strcmp(stra,strb)==0
st1==str2比较的是两个字符数组的起始地址。stra==strb比较的是字符串的地址。为什么stra==strb成立,因为stra,strb指向的是字符串常量。这两个字符串经过编译器优化后就只有一个了。所以stra,strb指向的是同一个字符串。自然字符串的地址就只有一个了。
JXLFZ 2012-02-05
  • 打赏
  • 举报
回复
两个都是比较指针,如果stra == strb 为真时,则它们指向同一个字符串,和strcmp(stra,strb) == 0 是一样的
jixingzhong 2012-02-05
  • 打赏
  • 举报
回复
指针相等,意味着两个指针指向了相同的一块内存区域,也即是两个指针指向了同一个目标(字符串),同一个字符串,strcmp自然是相等的。
老规矩,先看本节效果图我们实现这个支付功能完全是借助小程序云开发实现的,不用搭建自己的服务器,不用买域名,不用备案域名,不用支持https。只需要一个简单的云函数,就可以轻松的实现微信小程序支付功能。核心代码就下面这些一,创建一个云开发小程序关于如何创建云开发小程序,这里我就不再做具体讲解。不知道怎么创建云开发小程序的同学,可以去翻看我之前的文章,或者看下我录制的视频:https://edu.csdn.net/course/play/9604/204528创建云开发小程序有几点注意的1,一定不要忘记在app.js里初始化云开发环境。2,创建完云函数后,一定要记得上传二, 创建支付的云函数1,创建云函数pay三,引入三方依赖tenpay我们这里引入三方依赖的目的,是创建我们支付时需要的一些参数。我们安装依赖是使用里npm 而npm必须安装node,关于如何安装node,我这里不做讲解,百度一下,网上一大堆。1,首先右键pay,然后选择在终端中打开2,我们使用npm来安装这个依赖。在命令行里执行 npm i tenpay安装完成后,我们的pay云函数会多出一个package.json 文件到这里我们的tenpay依赖就安装好了。四,编写云函数pay完整代码如下//云开发实现支付 const cloud = require('wx-server-sdk')cloud.init() //1,引入支付的三方依赖 const tenpay = require('tenpay'); //2,配置支付信息 const config = ;exports.main = async(event, context) => 一定要注意把appid,mchid,partnerKey换成你自己的。到这里我们获取小程序支付所需参数的云函数代码就编写完成了。不要忘记上传这个云函数。出现下图就代表上传成功五,写一个简单的页面,用来提交订单,调用pay云函数。这个页面很简单,1,自己随便编写一个订单号(这个订单号要大于6位)2,自己随便填写一个订单价(单位是分)3,点击按钮,调用pay云函数。获取支付所需参数。下图是官方支付api所需要的一些必须参数。下图是我们调用pay云函数获取的参数,和上图所需要的是不是一样。六,调用wx.requestPayment实现支付下图是官方的示例代码这里不在做具体讲解了,完整的可以看视频。实现效果1,调起支付键盘2,支付完成3,log日志,可以看出不同支付状态的回调上图是支付成功的回调,我们可以在支付成功回调时,改变订单支付状态。下图是支付失败的回调,下图是支付完成的状态。到这里我们就轻松的实现了微信小程序的支付功能了。是不是很简单啊,完整的讲解可以看视频。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧