首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C Primer Plus(七)

字符串字面(字符串常量) 用双引号括起来的内容称为字符串字面(string literal),也叫作字符串常量(string constant)。..."; 该声明和下面的声明几乎相同: const char ar1[] = "Something is pointing at me."; 数组形式和指针形式不同?...以上面的声明为例,数组形式(ar1[])计算机的内存中分配为一个内含 29 个元素的数组(每个元素对应一个字符,还加上一个末尾的空字符’\0’)。每个元素被初始化为字符串字面对应的字符。...此时,才字符串拷贝到数组中。注意,此时字符串两个副本。一个是静态内存中的字符串字面,另一个是储存在 ar1 数组中的字符串。...该变量最初指向该字符串的首字符,但是它的值可以改变。因此,可以使用递增运算符。例如,++pt1 指向第 2 个字符(o)。 字符串字面被视为 const 数据。

64710

【cc++】深入探秘:C++内存管理的机制

(局部字符数组) 当你声明一个局部字符数组并用一个字符串字面初始化它,如char char2[] = "abcd";时,编译器栈上为数组分配内存,然后字符串字面的内容(包括结尾的\0字符)复制到这块内存中...因此,char2和它的内容(*char2指向的内容)都存储栈上 *pChar3(字符串字面指针) 另一方面,当你使用指针指向一个字符串字面,如const char* pChar3 = "abcd...";时,这个字符串字面存储程序的只读数据段(或称为代码段、常量区)中。...因此,尽管pChar3是一个指针,存储栈上,但它指向的字符串内容存储常量区 总结: *char2不在常量区,因为char2是局部字符数组,其内容直接存储栈上。...*pChar3常量区,因为它指向的是一个字符串字面字符串字面被存储程序的常量区域,这部分内存是只读的。

19210
您找到你想要的搜索结果了吗?
是的
没有找到

C++奇迹之旅:C++内存管理的机制初篇

*char2 和 char2 栈中, *char2:char2[] 是一个局部字符数组,存储栈上。...当你使用字符串字面初始化它时,编译器会在栈上分配足够的内存空间,并将字符串字面的内容(包括结尾的 \0)复制到这块内存中,所以 *char2 指向的是存储栈上的可修改的字符数组。...*pChar3:const char* pChar3 = "abcd"; 中的字符串字面 "abcd" 存储只读的数据段(常量区)中。...而pChar3 本身是一个指针变量,存储栈上,它指向常量区中的字符串。由于字符串字面是只读的,所以通过 *pChar3 我们只能读取字符串的内容,而不能修改它。...,对于数组,strlen 只能用于字符数组(字符串),不能用于其他类型的数组,对于指针,strlen 可以计算指针所指向的字符串的长度。

10510

第八节(字符字符串

: char string[10] = "Alabama"; 程序中使用字符串字面时,编译器会在字符串的末尾自动加上表示字符串末尾的空字符。...两种方法: 第1种方法是,在编译程序时为字符串字面分配空间; 第2种方法是,执行程序时使用malloc()函数分配空间,这个过程称为动态分配。...该数组最初只能储存3个字符一一'N' 、'o’和1个空字符 而"YEs ”4个字符 Y   E   s  和1个空字符。如果这样做,你完全不知道第4个字符(空字符)会擦写什么内容。...由于字符串字面相当于指向字符串指针,因此puts()函数除了可以显示指针指向的字符串,还可用于显示字符串字面。...()函数可以显示多个字符串,也可以文本字面和数值变量混合输出: char *bank = "First Federal"; char * name = "John Doe"; int balance

27330

《C Primer》笔记(上篇)

2.字符串字符 字符串常量"x"字符常量'x'不同,前者是派生类型(char数组),后者是基本类型(char)。字符串常量"x"由两个字符'x'和空字符\0组成。...注意,此时字符串两个副本,一个是静态内存中的字符串字面,另一个是存储ar1数组中的字符串。 此后,编译器便把数组名ar1识别为该数组首元素地址&ar1[0]的别名。...字符串字面被视为const数据,由于pt1指向这个const数据,所以应该把pt1明为指向const数据的指针。==这意味着不能使用pt1改变它所指向的数据,但仍然可以改变pt1的值。...==如果把一个字符串字面拷贝给一个数组,就可以随意改变数据,除非把数组声明为const。 总结: 初始化数组把静态存储区的字符串拷贝到数组中,而初始化指针只把字符串的地址拷贝给指针。...mytalents中的指针指向初始化时所用的字符串字面的位置,这些字符串字面被储存在静态内存中;而yourtalents中的数组则存储着字符串字面的副本,所以每个字符串都被存储了两次。

1.8K40

拿捏住C字符串,这个烦人程度不亚于指针的小东西

这句话我一直在理解,每到一个阶段,都会有不同的理解。 时至今日,我的理解还是比较浅薄的,算法题中,字符串的重要程度跟指针等绝对是不能同日而语的。 但是开发中,IO过程就是核心了。...作为IO过程的组成部分,字符串处理就是这个核心中的核心了、 ---- 基础扫盲篇 字符串字面 难度指数:2 | 细节指数:3 | 重要指数:3 字符串字面一般分配在只读内存中,所以是不可变的。...字符串字面在哪里使用,是否全局、静态、局部,都无所谓的。 大部分编译器会将字符串字面看做常量,无法修改字符串,不过有些编译器会不一样,碧如GCC。...//可以理解为,字符串字面取出遍历,一个一个的放进字符数组char test[10]; test = "asdfghjkl"; //报错,表达式必须是可修改的左值 //不能把字符串字面的地址赋给数组名字...函数 strlen 不同,它的参数可以是数组指针、类型、对象、函数等 这里需要特别注意的是,函数 strlen 返回的是一个类型为 size_t 的值,从而有可能让程序导致意想不到的结果,如下面的示例代码所示

26310

Rust FFI 编程 - Rust导出共享库02

我们首先回顾关于字符串的基础知识,了解其Rust和C中的区别,然后设计具体的示例进行实践,并整理出传递字符串的FFI编程范式。 基础知识 C 语言中,字符串可看作是由字符组成的一维的字节数组。...字符串可以用指针和字节数组来表示,这是两种不同方式的存储: 字符串存储字符类型的数组中时,最初,字符串是字节序列,其中每个字节代表一个字符。但后来为了表示宽字符,ISO C 标准引入了新类型。...由于传递给函数的是第一个元素的地址,因此该函数并不知道数组多大,只能依靠空终止符来判断何时停止处理。 1)共享的只读字符串 char *。...大多数编译器中,字符串字面直接分配给指针后,字符串常量被存储于初始化数据段的只读(.roadata)区域,而指针变量被存储于读写区域中,也就是说可以更改指针以指向其它内容,但不能更改字符串常量的内容...字符串对字节数组进行初始化后,函数执行时会被拷贝到栈区或堆区(使用 malloc),这时数组的内容是可以被修改的。因此,对于需要修改的字符串,应使用char[] 方式声明。

99620

操作系统·进程

优先级调度算法 -算法:CPU分配给就绪队列中优先级最高的进程 -静态优先级 进程创建时确立,确定后运行期间保持不变。...看一下后缀: 后缀 功能 l 希望接收以逗号分隔的参数列表,列表以NULL指针作为结束标志 v 希望接收到一个以NULL结尾的字符串数组指针 p 是一个以NULL结尾的字符串数组指针,函数可以DOS的...*argv[]) { //以NULL结尾的字符串数组指针,适合包含v的exec函数参数 char *arg[] = {"ls", "-a", NULL}; /** * 创建子进程并调用函数...*p是一个以NULL结尾的字符串数组指针,函数可以DOS的PATH变量查找子程序文件 */ if( fork() == 0 ) { // in clhild printf...*p 是一个以NULL结尾的字符串数组指针,函数可以DOS的PATH变量查找子程序文件 */ if( fork() == 0 ) { printf("4----------

88920

C语言中的字符串处理

字符串字面(字符串常量,C标准中称为,字符串字面)如何存储字符串字面  从本质上而言,C/C++ •字符串字面(字符串常量,C标准中称为...,字符串字面) 如何存储字符串字面 从本质上而言,C语言把字符串字面作为字符数组来处理。...字符串字面的操作 通常情况下可以在任何C语言允许使用 char * 指针的地方使用字符串字面。...字符数组字符指针 一起来比较一下下面两个声明: char date[] = "June 14";它声明date是个字符数组。...两者之间有着显著的差异: (1) 声明为数组时,就像任意数组元素一样,可以修改存储date中的字符声明为指针时,date指向字符串字面。 (2) 声明为数组时,date是数组名。

1.1K30

C++数据类型

基本内置类型:编译器内置的基本类型,包括算数类型(字符、整型数、布尔值、浮点数)和空类型void 复合类型:基于其他类型定义的类型,包括数组、C风格字符串指针、引用、C风格结构体(POD)和联合体(...字符字符串字面 'a'表示一个字符;"a"字符串字面包含字母a和空字符\0。...当书写的字符串字面比较长,我们可以采取分开书写的方式: std::cout << "line one" "line two" << std::endl; 3....布尔字面指针字面 true和false和布尔类型的字面 nullptr是指针类型的字面 引用 C++11新增了右值引用的概念,我们这里只提及左值引用。...C++11中我们可以用字面nullptr初始化指针来得到空指针,它可以被转化成任意其他的指针类型。

91920

C++ Primer Plus 第四章 复合类型 学习笔记

基于String类库的方法 存储连续字节中的一系列字符意味着可以字符串存储char数组中。其中每个字符都位于自己的数组元素中。...使用引号括起来的字符串,这种字符串字符串常量(String constant) 或 字符串字面值(string literal) 。 字符串常量(使用双引号)不能与字符常量(使用单引号)互换。...例如: char name[] = "Soler"; 字符串结尾的空字符,不用直接显式包括,机器键盘输入,字符串读入到char类型中,会在结尾自动加上空字符。...\n" 2.3 在数组中使用字符串 字符串存储到数组的常用方法: 数组初始化为字符串常量 键盘或文件输入读入到数组中。...cout和多数C++表达式中,char数组名、char指针以及用引号括起来的字符串常量都被解释为字符串第一个字符的地址。 不要使用字符串常量或未被初始化的指针来接收输入。

1.8K00

江哥带你玩转C语言 | 13- 一级指针和多级指针

指针基本概念 什么是地址 生活中的地址: 内存地址: 地址内存单元中的数据是两个完全不同的概念 地址如同房间编号, 根据这个编号我们可以找到对应的房间 内存单元如同房间, 房间是专门用于存储数据的...地址形象化的称为“指针” 内存单元的指针(地址)和内存单元的内容是两个不同的概念。...同时返回两个数的和差 ---- ##数组指针的概念及定义 数组元素指针 一个变量地址,一个数组包含若干元素,每个数组元素也有相应的地址, 指针变量也可以保存数组元素的地址 只要一个指针变量保存了数组元素的地址...]; x++; //错误 int* p = x; p++; //正确 ---- 指针字符串 定义字符串的两种方式 字符数组 char string[]=”I love lnj!”...; printf("%s\n",string); 字符串指针指向字符串 // 数组名保存的是数组第0个元素的地址, 指针也可以保存第0个元素的地址 char *str = "abc" 字符串指针使用注意事项

49100

江哥带你玩转C语言 | 14 - 结构体-枚举-共用体

什么是结构体 结构体和数组一样属于构造类型 数组是用于保存一组相同类型数据的, 而结构体是用于保存一组不同类型数组的 例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型...从定义的那一行开始, 直到遇到return或者大括号结束为止 结构类型定义函数外部的作用域全局变量的作用域是相同的 从定义的那一行开始,直到本文件结束为止 //定义一个全局结构体,作用域到文件末尾...个字节分配给age4个,还剩下4个字节 当需要分配给score时, 发现只剩下4个字节, 所以会再次开辟8个字节存储空间 新分配的8个字节分配给score, 还剩下0个字节 当需要分配给ch时, 发现上一次分配的已经没有了...---- 枚举 什么是枚举类型? 实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只十二个月,一个班每周六门课程等等。...如果把这些说明为整型,字符型或其它类型 显然是不妥当的。 C语言提供了一种称为“枚举”的类型。“枚举”类型的定义中列举出所有可能的取值, 被说明为该“枚举”类型的变量取值不能超过定义的范围。

72900

总结了一些指针易出错的常见问题(三)

指针字符串 NULL和NUL区别:前者用来表示特殊的指针((void*)0),而NUL是一个char(\0),不可混用。   ...字符常量:单引号;字符串:双引号;   字符串的声明方式:字面字符数组指针。     字符串字面池: ?   ...字符串初始化      初始化char数组:   char header[]="Media Player"; ?     ...header;初始化这个字符串的常见方法是使用malloc和strcpy函数分配内存并将字面复制到字符串中。       ...返回字符串   函数返回字符串时,它返回的实际是字符串的地址。重点是如何返回合法的地址,可以返回以下三种对象之一的引用:字符/动态分配的内存/本地字符串变量。 函数指针字符串 ? ? ? ?

62570

第3章 | 基本数据类型 | 布尔类型,字符,元组,指针类型

因此,String 会将其文本表示为 UTF-8 字节序列,而不是字符数组字符字面是用单引号括起来的字符,比如 '8' 或 '!'。...还可以使用全角 Unicode 字符:' 錆 ' 是一个 char 字面,表示日文汉字中的 sabi(rust)。 字节字面一样,有些字符需要用反斜杠转义,如表 3-10 所示。...元组有点儿类似于数组,即这两种类型都表示值的有序序列。许多编程语言混用或结合了这两个概念,但在 Rust 中,它们是截然不同的。一方面,元组的每个元素可以不同的类型,而数组的元素必须都是相同的类型。...然而, C 指针不同,Rust 的引用永远不会为空:安全的 Rust 中根本没有办法生成空引用。... C 不同,Rust 会跟踪值的所有权和生命周期,因此早在编译期间就排除了悬空指针、双重释放和指针失效等错误。 Rust 引用两种形式。 &T 一个不可变的共享引用。

7310

c++字符串c字符串

例如,sizeof(char)返回1, 因为char的大小是1字节。但是,C风格的字符串中,sizeof()和strlen()是不同的。绝对不要通过 sizeof()获得字符串的大小。...C++标准正式指出:字符串字面的类型为“n个const char数组”,然而为了向后兼容较老的不支持const的代码,大部分编译器不会强制程序字符串字面赋值给 const char类型的变量。...一种更安全的编码方法是引用字符串常量时,使用指向 const 字符指针。...Attempts to write to read-only memory 还可以字符串字面用作字符数组char®的初始值。...这种情况下,编译器会创建一个足以放 下这个字符串数组,然后字符串复制到这个数组。因此,编译器不会将字面放在只读的内存中,也不会进行字面的池操作。

1.4K30

指针03

指针字符串 之前已经写过很多关于字符串的文章了 感兴趣的可以自己去看一下 这里仅对指针操作字符串进行代码编写 #include void printfchar(char* c) {...str[] = "hello"; printfchar(str); } 也可以去掉i 利用指针进行自增 `C++++ 在内存中分析这个程序 字符数组的大小 = 字符数组元素数量 字符数组存放字符串大小...=字符数组元素数量+1 乱总结的 迷糊的别看 char*和char[]辨析 char str[] = "hello"; 编译器会在栈区给这个数组分配一段空间存放 因此我们可以通过指针修改字符串的内容...char*str = "hello";之前我也说过这种初始化 形式上字符串数组没有区别 但字符串常量存放在常量区 就是之前画的那个static区 里面的数据是无法修改的 同时他也会一直存在 直到程序运行结束...char* address = strA(); printf("%s", address); } str创建在栈区后 当被调函数执行完成之后 编译器会清空分配给字符串数组的空间 因此当主调函数去接收返回的首地址时

10220

计算机初级选手的成长历程——指针(6)

这里我们就需要引入一个新的概念——常量字符串介绍常量字符串之前,我们先要弄清楚什么是常量。...14.2 常量 常量顾名思义就是不变的C语言中常量四种分类: 字面常量 const修饰的常变量 枚举常量 #define定义的标识符常量 const修饰的常变量 在前面我们已经介绍了const修饰的局部变量...常量字符串字符数组类似,字符串中的元素也是对应的元素下标,并且下标是从0开始逐渐递增。当我们通过字符指针指向常量字符串时,指针指向的实质上是常量字符串的首元素地址。...p = "abcd"; return 0; } 当我们常量字符串放在数组中时,实质上是函数栈帧上开辟了一块新的空间,空间内存放了对应的字符,我们通过指针或者是数组名[下标]对数组元素进行更改时...15.5.1 数组指针区别 在前面介绍时我们说过,在某些特定的情况下数组名代表的是数组在内存空间中的起始位置,大部分情况下数组名就是指针; 所以我们对数组名和指针的处理也是采取的模糊化的方式,数组名就是看成指针

12810

说出来你们可能不信,但是数组名确实不是指针常量

数组声明(array declaration)所声明的变量) 首先,数组名不是常量指针,从两方面: 类型方面,数组的类型是type[size],和常量指针类型type* const不同 使用方面,...sizeof(数组名)等于数组所有元素的大小,而不是sizeof(指针);对数组取地址,得到的指针进行加减,增减字节数是sizeof(数组);你可以用字符串字面初始化一个字符数组,但是不能用常量指针来初始化一个字符数组...其次,为什么很多老师都说数组是常量指针 他们不了解C语言的类型系统和隐式转换规则 他们怕下面的人听不懂 他们解释不清为什么数组名不能进行赋值或者++之类的运算而指针可以 切入正题,我们从类型系统和隐式转换规则来讲...) 数组大部分情况下会隐式转换为首元素指针右值,除了(参见 Implicit conversions) sizeof运算的时候 取址的时候 用字符串字面初始化字符数组的时候 以及C11的_Alignof...这一套过程,用那个什么数组名是常量指针的说法,是解释不来的。

1.5K60

程序员C语言快速上手——基础篇(五)

str[] = "hello"; 15 16 // 循环遍历字符数组,当遍历到字符串结束符就停止 17 for (int i = 0; str1[i] !...除了C/C++,很多高级语言中,声明和定义基本是等同的,大量不了解C语言的程序员也是这么看待的,那么声明和定义到底是什么什么区别呢?...网上存在很多错误的言论和资料,一定要明确,C语言中,数组不存在值传递,这也是为什么不能对做函数参数的数组使用sizeof运算的原因所在,因为它会自动退化为指针。...理解了内存的原理,那么我们就会明白,为什么几乎所有的编程语言中都指明字符串是不可变对象。...根据指向的目标变量的类型不同指针变量也应当声明为相应的类型。例如,指向char型变量,则应声明为char *p;。另一个重要的原则是先初始化,后使用。

90020
领券