charnbsp;*p和charnbsp;p[]赋值时的…

2024-08-31 19:32
文章标签 赋值 charnbsp

本文主要是介绍charnbsp;*p和charnbsp;p[]赋值时的…,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文地址:char *p和char p[]赋值时的区别。 作者:嫦娥的小兵

char *s="abc";
char str[]="abccd";

经过反汇编,得到:

char *str="abc";   的汇编代码

mov         dword ptr [ebp-4],offset string "abc" (0046f034)

 

char str[ ]="abccd"; 的汇编代码

mov         eax,[string "abccd" (0046f02c)]
mov         dword ptr [ebp-0Ch],eax
mov         cx,word ptr [string "abccd"+4 (0046f030)]
mov         word ptr [ebp-8],cx

 

1、char *s="abc";

     看这个赋值:

     右边,是"abc",是个字符串常量,存在于内存某处(我的机器上是ds:0x0046f034),程序员不知道,编译器安排的,也没必要知道(当然,这个赋值之后,程序员就知道并能控制这个串了)。字符串常量所在内存是只读的。

     左边,字符指针s,赋值时候,把地址ds:0x0046f034的偏移地址("abc"所在),存放到指针变量s(其地址为 ds:0x0046f034)中。程序员能完全控制的内存只是指针变量所占据的这四个字节内存,只能改变该指针的指向,至于其指向的内存能不能写,那就看程序了,本程序是指向的只读内存,不能写!

2、char str[]="abccd";

     再看这个赋值:

     右边,和上面类似,是"abccd",也是个字符串常量,存在于内存某处(是ds:0x0046f02c),程序员不知道,编译器安排的(这个赋值之后,程序员还是不知道这个常量在哪里,因为并没有用指针指向这块内存,这和上面不同)。该字符串常量所在内存也是只读的。

     左边,字符数组str,赋值时候,把地址ds:0x0046f02c("abccd"所在)所指内存中的内容,复制到字符数组str开始(其地址为 ds:0x0013ff74)的内存中,每复制一个字符都会开辟一个字节(char型变量占1字节)内存来存放这个字符(这也是实现了数组元素个数的动态确定)。从字符数组str开始的这部分存放这些字符的内存是程序员可以完全控制的,可读写,因此在这些内存写当然是没有问题的!

这篇关于charnbsp;*p和charnbsp;p[]赋值时的…的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124795

相关文章

Go 数组赋值问题

package mainimport "fmt"type Student struct {Name stringAge int}func main() {data := make(map[string]*Student)list := []Student{{Name:"a",Age:1},{Name:"b",Age:2},{Name:"c",Age:3},}// 错误 都指向了最后一个v// a

《C++中的移动构造函数与移动赋值运算符:解锁高效编程的最佳实践》

在 C++的编程世界中,移动构造函数和移动赋值运算符是提升程序性能和效率的重要工具。理解并正确运用它们,可以让我们的代码更加高效、简洁和优雅。 一、引言 随着现代软件系统的日益复杂和对性能要求的不断提高,C++程序员需要不断探索新的技术和方法来优化代码。移动构造函数和移动赋值运算符的出现,为解决资源管理和性能优化问题提供了有力的手段。它们允许我们在不进行不必要的复制操作的情况下,高效地转移资源

python基础语法十一-赋值、浅拷贝、深拷贝

书接上回: python基础语法一-基本数据类型 python基础语法二-多维数据类型 python基础语法三-类 python基础语法四-数据可视化 python基础语法五-函数 python基础语法六-正则匹配 python基础语法七-openpyxl操作Excel python基础语法八-异常 python基础语法九-多进程和多线程 python基础语法十-文件和目录操作

数字电路专题:verilog 阻塞赋值和非阻塞赋值

verilog 阻塞赋值 和 非阻塞赋值 “=”阻塞赋值, ”<=”非阻塞赋值。阻塞赋值为执行完一条赋值语句,再执行下一条,可理解为顺序执行,而且赋值是立即执行; 非阻塞赋值可理解为并行执行,不考虑顺序,在 always 块语句执行完成后,才进行赋值。 如下面的阻塞赋值: //代码如下:module top(din,a,b,c,clk);input din;input clk;out

js 获取select的值 / js动态给select赋值

正常使用的: var month =  $('#month option:selected').val();//选中的值 var a = $('#month option:selected').text();//选中的文本 var b = $('#month option:selected') .val();//选中的值 var c = $("#month").get(0).selected

struts1 中ActionForm赋值原理

在struts1中,没有struts2封装得好,对简单数据类型没有什么不一样,但是对于一个对象,列表等要麻烦一点,不过只要知道struts1底层是怎么对数据进行赋值的话,操作起来也比较简单。          首先说明一下在struts1中,当点击submit后,把表单中的数据全部提交,在后台是用一个Map来接收表单中的数据,struts对ActionForm中的数据赋值也是从这个map

【大数据Java基础-JAVA 面向对象09】类成员(三)类的结构:构造器(一)简介;属性赋值顺序;JavaBean的概念

1.构造器(或构造方法):Constructor 构造器的作用: 1.创建对象 2.初始化对象的信息   2.使用说明: 1.如果没显式的定义类的构造器的话,则系统默认提供一个空参的构造器 2.定义构造器的格式:权限修饰符 类名(形参列表){} 3.一个类中定义的多个构造器,彼此构成重载 4.一旦我们显式的定义了类的构造器之后,系统就不再提供默认的空参构造器 5.一个类中,至少会有一个构

赋值函数;复制函数

每个类只有一个赋值函数.   由于并非所有的对象都会使用 拷贝构造函数 和赋值函数,程序员可能对这两个函数有些轻视。请先记住以下的警告,在阅读正文时就会多心:    1. 如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数。倘若类中含有指针变量,那么这两个缺省的函数就隐含了错误。以类String的两个对象a,b为例,假设a.m_data的内容为“h

FPGA 编程基础, 赋值操作符, 运算符使用, 条件表达式, 信号操作方法

1. **赋值符号**:    - **"="**:阻塞赋值,即在`always`模块中该语句会被立即执行。    - **"<="**:非阻塞赋值,用于`always`模块中,使所有语句在模块结束时一起更新。此符号也用于表示小于等于,具体含义由上下文决定。 2. **算术运算符**:    - **"+","-","*","/","%"**:分别代表加法、减法、乘法、除法和取

Go-变量声明与赋值

从本节开始,按照Introducing Go一书的顺序,学习并总结Go。——package部分的顺序有所调整。 要点 可以先用var声明,然后用等号赋值;也可以用:=把上面两步合并为一步。区别:=仅用于已经声明过的变量;而:=是声明加赋值。——可参考编译错误信息。 示例 hello.c: package mainimport "fmt" // implements formatted