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

在声明时将字符串字面量分配给char数组与将字符指针分配给char指针有什么不同?

在声明时将字符串字面量分配给char数组与将字符指针分配给char指针有以下不同之处:

  1. 数据类型:在将字符串字面量分配给char数组时,数据类型为数组类型,即char[];而将字符指针分配给char指针时,数据类型为指针类型,即char*。
  2. 内存分配:当将字符串字面量分配给char数组时,编译器会在编译期间为数组分配足够的内存空间,将字符串字面量的内容复制到数组中;而将字符指针分配给char指针时,仅会为指针变量分配内存空间,指针变量指向的字符串字面量的内存空间由程序运行时决定。
  3. 可修改性:将字符串字面量分配给char数组后,数组中的元素可以被修改,因为数组是一块连续的内存空间;而将字符指针分配给char指针后,指针指向的字符串字面量是不可修改的,因为字符串字面量在大多数情况下是存储在只读内存区域的。
  4. 字符串长度:通过将字符串字面量分配给char数组,可以获取字符串的长度,即使用sizeof()函数可以得到数组的长度(不包括空字符'\0');而将字符指针分配给char指针时,无法直接获取字符串的长度,需要使用strlen()函数来计算字符串的长度。
  5. 字符串拷贝:将字符串字面量分配给char数组后,可以通过strcpy()函数将其他字符串拷贝到数组中;而将字符指针分配给char指针时,需要使用strcpy()函数将其他字符串拷贝到指针指向的内存空间中。

总结起来,将字符串字面量分配给char数组可以修改字符串内容,并且可以获取字符串长度,但需要提前确定存储字符串的数组大小;将字符指针分配给char指针时,无法修改字符串内容,且无法直接获取字符串长度,但可以动态确定字符串的存储空间大小。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C Primer Plus(七)

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

68910

【C语言】字符串字面量的特殊性

前言 在 C 语言编程中,字符串字面量是一个容易让初学者感到困惑的概念。字符串字面量与字符数组在表面上有许多相似之处,但在底层存储方式及可修改性方面存在本质差异。...指针与数组的区别 理解字符串字面量和字符数组的区别时,还需理解指针和数组之间的差异。 指针指向字符串字面量:例如,char *str = "Hello";。...数组和指针的这种区别使得它们在处理字符串时有着不同的适用场景。指针非常适合用于遍历和操作字符串数据,但当需要可变的字符串时,字符数组则更加灵活。...你可以将字符数组用作缓冲区来存储不同的字符串内容,这在编写需要灵活字符串处理的程序时非常方便。例如在实现字符串拼接、格式化等功能时,字符数组比字符串字面量更为合适。...而字符数组则不同,它们是可修改的,并具有独立的内存空间,因此在需要频繁变更字符串内容的场景下更为合适。 在编写 C 语言代码时,理解字符串字面量与字符数组之间的区别至关重要。

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

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

    27710

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

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

    14010

    《C Primer》笔记(上篇)

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

    2.1K40

    第八节(字符和字符串)

    : 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

    32430

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

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

    29510

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

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

    1K20

    操作系统·进程

    优先级调度算法 -算法:将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----------

    92520

    一篇读懂 C 指针

    1 array_p = array; 这是因为,“指向 int 的指针”与“指向 int 的数组的指针”是不同的类型。 array 和 &array 指向的是相同的地址。那么它们到底有何不同呢?...初始化数组时的字符串字面量 用双引号括起来的字符串被称为 字符串字面量(string literal)。...字符串字面量的类型实际上是“char 数组”,因此在表达式中,它会被解读为指向 char 类型的指针。...1 2 char *str; str = "abc"; // 将指向"abc"初始元素的指针赋值给 str 当用字符串字面量来初始化 char 数组时,编译器会进行特殊处理。...它会将字符串字面量视为一个省略了花括号的字符列表。也就是说,编译器会将 "abc" 这样的字符串字面量视为 { 'a', 'b', 'c', '\0' } 这样的字符数组。

    13510

    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初始化指针来得到空指针,它可以被转化成任意其他的指针类型。

    96620

    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" 字符串指针使用注意事项

    53100

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

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

    77700

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

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

    65670

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

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

    9410

    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.5K30

    指针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创建在栈区后 当被调函数执行完成之后 编译器会清空分配给字符串数组的空间 因此当主调函数去接收返回的首地址时

    12420

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

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

    14410
    领券