精华内容
下载资源
问答
  • 而“a”则属于字符串常量,在C语言中没有直接储存字符串的变量,一般是通过数组存储。 另外,对于字符常量的内存占一个字节,对于字符创常量则会占2个字节,因为字符串常量,系统会在末尾自动加一个结束标志服'\0'...

    例如

    void main()

    {

    int c1='a';

    }

    在该函数中,‘a’属于字符常量

    而“a”则属于字符串常量,在C语言中没有直接储存字符串的变量,一般是通过数组存储。

    另外,对于字符常量的内存占一个字节,对于字符创常量则会占2个字节,因为字符串常量,系统会在末尾自动加一个结束标志服'\0'。

    展开全文
  • C中字符串常量&字符数组&字符常量

    千次阅读 2019-12-17 11:21:42
    在 C 语言中,字符串有两种存储方式,一种是通过字符数组存储,另一种是通过字符指针存储。...C语言字符常量与字符串常量 备注:字符常量和字符变量: 字符常量字符常量是用单引号括起来的一个字符,...

    在 C 语言中,字符串有两种存储方式,一种是通过字符数组存储,另一种是通过字符指针存储。

    一、字符常量:

     一个用单引号括起来的单个字符(或字符转义序列或三字母词)

    实质(含义):是一个整形值。属于四大基本数据类型(分别是整型,浮点型,指针,聚合类型)中的整型(integers)。

    C语言字符常量与字符串常量

    备注:字符常量和字符变量:

    • 字符常量
      字符常量是用单引号括起来的一个字符,如'a'、'A'、'1'、'='。因此字符常量有以下特点:
      I. 字符常量只能用单引号括起来,不能用双引号或其他符号。
      II. 字符常量只能是单个字符,即单引号内只能有一个字符。
      转义字符是一种特殊的字符常量,有以下特点:
      I. 转义字符以反斜线"\"开头,后面跟一个或几个字符。
      II. 转义字符具有特定的含义,不同于字符原有的意义。
    • 字符变量
      I. 字符变量的类型说明符为char,字符变量定义格式为:char a;、char a,b;
      II. 字符变量用来存储字符常量,字符值是以ASCII码的二进制形式存放在变量的内存单元之中的,如字符'x'的ASCII码是120,定义字符变量char a = 'x';,实际上字符变量a内存放120的二进制代码。若将整型值直接赋值给字符变量,如char a = 100;,实际上是将ASCII码为100的字符'd'赋值给了字符变量a。
      III. 字符型可看做一种特别短的整型
      类型说明符:[signed] char,表示的数值范围:-128 ~ 127,存储大小:1字节
      类型说明符:unsigned char,表示的数值范围:0 ~ 255,存储大小:1字节

    字符型参与算术运算

    由于字符型可看做一种特别短的整型,因此可以将字符型与整型进行算术运算。

    #include <stdio.h>
    
    int main(void)
    {
        printf("%d\n", 'A'+2);
        printf("%c\n", 'A'+2);
    }
    

    以上程序输出:

    67
    C
    

    字符型参与算术运算,实际上是将字符对应的ASCII码进行算术运算。字符'A'对应的ASCII码为65,应此'A'+2以十进制形式输出带符号整数的结果为67;而ASCII码值为67的字符为'C',应此'A'+2以单个字符输出的结果为C。

    \n——换行,

    \t——tab,

    \r——回车,

    \f——换页,

    \b——退格,

    \ddd——1到3位8进制的数代表的字符

    二、字符串常量:

     两种定义方式:

    (字符数组)数组方式定义字符串:当数组名用于表达式中时,它们的值也是个指针常量。我们可以对它们进行下标引用、间接访问以及指针运算。

    (字符串指针)指针常量定义字符串:当一个字符串常量出现在表达式中时,它的值是个指针常量。编译器把这些指定字符的一份拷贝存储在内存的某个位置,并存储一个指向第一个字符的指针。(一个是指针的地址,一个是字符串的地址)

    1、

    char str[] = "hello, world";
    str[1] = 'a';
    
    

    2、

    char *str = "hello, world";
    str[1] = 'a';
    
    

    两个程序都可以编译,但第二个运行会出现段错误。

    两个程序的区别在:

    第一个程序的 str 属于初始化变量,str 如果是局部变量则指向栈上的内存区域,如果是 static 或全局变量则指向进程的 data 段内存区域。data 段权限是可读可写

    第二个程序中 "hello, world" 是一个字符串面量,str 的确指向其地址,但该地址存在于在进程的 text 段,text 段除了保存常量还保存可执行代码,因此是不允许可写权限的,而是只允许可读可执行权限

     实例:

    char p[] = "hello"; // 方式1
    
    char *p = "hello"; // 方式2
    
    char *p;
    p = (char *)malloc(sizeof(char)*6);
    strcpy(p, "hello"); // 方式3
    
    

    这三种情况下:
    方式1:所有6个char字符都连续的存放在栈区。内容可更改!
    方式2:"Hello"存在程序内存的常量区中,是编译时就固定下来的(不可更改),然后p是一个指向常量区"hello"的指针,p本身存在栈区
    方式3: malloc向堆申请了空间,p存放在栈区,指向malloc申请出来的地址,最后"hello"就被copy到了p所指向的地址。内容可更改!
    从速度来看1中栈的数据都是直接读的,另外两种都需要通过指针间接读取,所以1显然是最快的。
    我觉得首先如果字符串很小且确定,可以用1的写法,在栈区速度快。
    如果字符串很大或者不确定,要知道栈区大小是有限的,所以采用3的动态分配比较好。
    如果字符串被大量复用,其实可以采用2中写法,这样只要引用了常量区的同一字符串,他们将会共用同一块地址。(当然这种共用是合理的,因为那里的字符串是不可修改的,且到程序结束才会被释放)。

    C语言字符串常量

    示例代码:

    #include <stdio.h>
    #include <string.h>
    int main() {
    	printf("\t方式1……\n");
    	char p0[] = "hello"; // 方式1
    	printf("输出数组定义字符串:%s\n",p0);
    	printf("输出数组定义字符串地址:%p\n",p0);
    	//更改数组P0中的某一个元素
    	p0[0] = 'H';
    	printf("输出数组定义字符串:%s\n", p0);
    	/*
    	printf("\t方式2……\n");
    	char *p1 = "hello"; // 方式2
    	printf("输出指针定义字符串:%s\n", p1);
    	printf("输出指针定义字符串地址:%p\n", &p1);
    	//更改数组P1中的某一个元素
    	p1[0] = 'H';
    	printf("输出指针定义字符串:%s\n", p1);
    	*/
    	printf("\t方式3……\n");
    	char *p2;// 方式3
    	p2 = (char *)malloc(sizeof(char) * 6);
    	strcpy(p2, "hello");
    	printf("输出指针定义字符串:%s\n", p2);
    	printf("输出指针定义字符串地址:%p\n", &p2);
    	//更改数组P2中的某一个元素
    	p2[0] = 'H';
    	printf("输出指针定义字符串:%s\n", p2);
    	return 0;
    }
    

    运行结果:

    示例代码:

    #include <stdio.h>
    #include <string.h>
    int main() {
    	printf("\t方式1……\n");
    	char p0[] = "hello"; // 方式1
    	printf("输出数组定义字符串:%s\n",p0);
    	printf("输出数组定义字符串地址:%p\n",p0);
    	//更改数组P0中的某一个元素
    	p0[0] = 'H';
    	printf("输出数组定义字符串:%s\n", p0);
    	
    	printf("\t方式2……\n");
    	char *p1 = "hello"; // 方式2
    	printf("输出指针定义字符串:%s\n", p1);
    	printf("输出指针定义字符串地址:%p\n", &p1);
    	//更改数组P1中的某一个元素
    	p1[0] = 'H';
    	printf("输出指针定义字符串:%s\n", p1);
    	
    	printf("\t方式3……\n");
    	char *p2;// 方式3
    	p2 = (char *)malloc(sizeof(char) * 6);
    	strcpy(p2, "hello");
    	printf("输出指针定义字符串:%s\n", p2);
    	printf("输出指针定义字符串地址:%p\n", &p2);
    	//更改数组P2中的某一个元素
    	p2[0] = 'H';
    	printf("输出指针定义字符串:%s\n", p2);
    	return 0;
    }

     方式2可以编译,但运行会出现错误

    运行结果:

     C语言中字符串常量的问题

    如下示例,表明不同的字符串所在的内存位置不一样,故不相等

    C/C++对字符串常量的处理策略

    指针常量示例:

    【 C 】彻底学会字符串常量

    示例代码:

    /*
    #include <stdio.h>
    int main() {
    	char *p_char = "Hello World";
    	printf("输出字符串:%s\n",p_char);
    	printf("输出指针指向字符串的地址:%p\n",&p_char);
    	printf("输出字符串:%c\n", p_char[1]);
    	p_char[1] = 'H';
    	printf("输出字符串:%s\n", p_char);
    	//printf("输出指针指向字符串的地址:%p\n", &(p_char+1));
    	char str[] = "I Love Beijing";
    	printf("输出数组定义字符串:%s\n",str);
    	printf("输出数组定义字符串地址:%p\n",str);
    
    	return 0;
    }
    */
    
    /*
    #include <stdio.h>
    #include <string.h>
    int main() {
    	printf("\t方式1……\n");
    	char p0[] = "hello"; // 方式1
    	printf("输出数组定义字符串:%s\n",p0);
    	printf("输出数组定义字符串地址:%p\n",p0);
    	//更改数组P0中的某一个元素
    	p0[0] = 'H';
    	printf("输出数组定义字符串:%s\n", p0);
    	
    	printf("\t方式2……\n");
    	char *p1 = "hello"; // 方式2
    	printf("输出指针定义字符串:%s\n", p1);
    	printf("输出指针定义字符串地址:%p\n", &p1);
    	//技巧:
    	printf("输出指针定义字符串:%c\n", *"hello");
    	printf("输出指针定义字符串:%c\n", *("hello"+1));
    	printf("输出指针定义字符串:%c\n", *(p1 + 1));
    	//更改数组P1中的某一个元素
    	p1[0] = 'H';
    	printf("输出指针定义字符串:%s\n", p1);
    	
    	printf("\t方式3……\n");
    	char *p2;// 方式3
    	p2 = (char *)malloc(sizeof(char) * 6);
    	strcpy(p2, "hello");
    	printf("输出指针定义字符串:%s\n", p2);
    	printf("输出指针定义字符串地址:%p\n", &p2);
    	//更改数组P2中的某一个元素
    	p2[0] = 'H';
    	printf("输出指针定义字符串:%s\n", p2);
    	return 0;
    }
    */
    
    #include <stdio.h>
    #include <string.h>
    int main() {
    	printf("\t方式1……\n");
    	char p0[] = "hello"; // 方式1
    	printf("输出数组定义字符串:%s\n", p0);
    	printf("输出数组定义字符串地址:%p\n", p0);
    	//更改数组P0中的某一个元素
    	p0[0] = 'H';
    	printf("输出数组定义字符串:%s\n", p0);
    
    	printf("\t方式2……\n");
    	char *p1 = "hello"; // 方式2
    	printf("输出指针定义字符串:%s\n", p1);
    	printf("输出指针定义字符串地址:%p\n", &p1);
    	//技巧:
    	printf("输出指针定义字符串:%c\n", *"hello");
    	printf("输出指针定义字符串:%c\n", *("hello" + 1));
    	printf("输出指针定义字符串:%c\n", *(p1 + 1));
    	//更改数组P1中的某一个元素
    	p1[0] = 'H';
    	printf("输出指针定义字符串:%s\n", p1);
    
    
    	return 0;
    }
    
    

    运行结果:

     

     C语言字符常量与字符串常量

    来自知乎的提问:

    为什么char *a="xxxxx", *b="xxx"; strcpy(a, b);的用法不行?

    展开全文
  • 字符串常量

    2021-02-15 11:57:09
    字符串常量属于静态存储类别,该字符串只会被内存存储一次,在整个程序生命周期中可见 int main(int argc, char* argv[]) { char *p = "abcdefg"; char *p1 = "abcdefg"; char *p2 = "abc"; printf("p = %p\n",...

    字符串常量属于静态存储类别,该字符串只会被内存存储一次,在整个程序生命周期中可见

    int main(int argc, char* argv[])
    {
    	char *p = "abcdefg";
    	char *p1 = "abcdefg";
    	char *p2 = "abc";
    
    	printf("p = %p\n",p);
    	printf("p1 = %p\n",p1);
    	printf("p2 = %p\n",p2);
    	printf("abcdefg = %p\n","abcdefg");
    	return 0;
    }
    

    在这里插入图片描述

    当以字符数组的形式 并且初始化数组时,

    现将字符串存储在静态存储区中,程序开始运行时才为该数组分配内存,此时才将字符串拷贝到数组中。
    字符串有两个副本

    展开全文
  • 字符串常量属于静态存储类(static storage),静态存储是指如果在一个函数中使用字符串常量,即使是多次调用了这个函数,该字符串在程序的这个运行过程中只存储一份。整个引号中的内容作为指向该字符串位置的指针。...

    1. 字符串常量(字符串文字)

    字符串常量,如 " linux “,” hello world "等,以’\0’字符作为结尾符。用作右值(只读)。字符串常量属于静态存储类(static storage),静态存储是指如果在一个函数中使用字符串常量,即使是多次调用了这个函数,该字符串在程序的这个运行过程中只存储一份。整个引号中的内容作为指向该字符串位置的指针。这一点与把数组名作为指向数组存储位置的指针类似。

    int main()
    {
    	printf("%s,%p,%c\n","melon","happy",*"birthday");	
    	return 0;
    }
    

    %s输出字符串melon。
    %p产生一个指针,"happy"是个地址,输出字符串中第一个字符的地址。
    %c输出一个字符,*"birthday"产生所指向地址中的值,即字符串"birthday"中的第一个字符b。

    字符串常量有时候放在rodata段(只读数据段),有时候放在代码段,取决于平台。有时候在单片机中会放到代码段,GCC中会放在rodata段。

    2. char数组

    char数组,也称为字符数组。字符数组 char arr[ ] = “linux”,定义了一个数组arr,数组arr占用6个字节,右值"linux"本身只存在于编译器中,编译器将用它来初始化字符数组arr后就弃掉。这句等价于 char arr[ ] = {‘l’,‘i’,‘n’,‘u’,‘x’,’\0’};
    可以对数组所指向内存空间进行读写操作。

    sizeof(arr)为6,strlen(arr)为5
    

    3. char指针

    char指针,也成为字符串指针。
    字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为字符串的结束。
    char *p = "linux"定义了一个字符指针p,p占用4个字节(32位),分配在栈上。因为p是一个变量,所以可以进行指针的算术运算,
    "linux"存储在常量区,p只是保存了"linux"所占内存空间的首地址,所以为只读数据(右值)

    sizeof(p)为4,strlen(p)为5  //32位系统中,指针p占4个字节,所以sizeof(p)为4
    

    4. 字符串数组

    形式如char *arr[3] = {“melon”,“happy”,“birthday”};
    arr是一个由3个指向char指针组成的数组,arr数组中并不存放字符串,它只是存放字符串的首地址。
    可以把arr[0]看作表示第一个字符串,*arr[0]表示第一个字符串的第一个字符,或者用arr[0][0]表示第一个字符串的第一个字符。

    #define LEN 3
    int main()
    {
    	char *arr[LEN] = {"melon","happy","birthday"};
    	printf("%s\n",arr[0]);			//melon
    	printf("%s\n",arr[1]);			//happy
    	printf("%s\n",arr[2]);			//birthday
    	
    	printf("%c\n",*arr[0]);		//m
    	printf("%c\n",arr[0][0]);		//m
    	printf("%c\n",arr[0][1]);		//e
    	printf("%c\n",arr[1][0]);		//h
    	
    	return 0;
    }
    
    展开全文
  • 在程序中定义字符串?...字符串常量 属于静态存储类别(只会被存储一遍), 用双括号括起来的部分被视为指向该字符串存储位置的指针。 用char类型数组 定义字符串时, 应该注意指定数组大小时, 要保证数组的元素
  • C语言字符常量与字符串常量

    万次阅读 多人点赞 2019-02-28 09:51:03
    字符常量:一个用单引号括起来的单个字符(或字符转义序列或三字母词) 实质(含义):是一个整形值。属于四大基本数据类型(分别是整型,浮点型,指针,聚合类型)中的整型(integers)。 如‘a', '\n', '??!', ...
  • 区别一:字符常量用单引号引起的一个字符,而字符串常量是双引号引起的多个字符。 public class Demo { /* 字符常量: 1.数据类型是char,属于基本数据类型 2.使用单引号引用 3.只能是一个字符,如果是多个...
  • 字符串常量存储在静态区域,见论坛里讨论时,有高手好像说过是存储在只读区域,不明。 字符串是存储在栈上的,属于可读可写的内存。 示例1:读写差异 #include<stdio.h> #include<stdarg.h> int ...
  • JAVA的字符串常量

    2019-11-17 17:50:58
    字符串常量池String Pool 这个名词还是在初学 ==与equals进行字符串比较时的不同而涉及到的, 在Java中 ,字符串属于引用型数据变量也就是意味着其是指向的一个地址(区别于基本数据类型) 在讲接下来内容之前先将...
  • 按照我的理解,类X,类Y,类Z中的三个常量字符串属于不同的对象,用 == 操作符比较,那么结果必然是 false,输出应该为:falsefalsefalsefalse但实际上输出确是:truetruefalsetrue使我大惑不解。并因此找了许多资料...
  • 1、字符串常量池介绍 2、创建字符串的两种方式 3、String &amp; StringBuilder &amp; StringBuffer 4、Q &amp; A 0、写在前面 本节主要分析String Constant Pool(SCP),即字符串常量池...
  • 在Java中,存放字符串常量的对象属于( )类对象。答:B青书学堂: (单选题) 结缔组织的分类是( )答:固有结缔组织、血液、软骨和骨组织关于斜方肌描述正确的是()答:在肩胛骨上回旋中起重要作用根据文件格式,不同可以...
  • 定义指针时,编译器并不会为指针所指向的对象分配空间的,它只会为指针本身分配空间,除非在定义时就用一个字符串常量进行初始化 例如 char *p = "hello"; 常量的本质:不占据任何存储空间属于指令的一部分,...
  • String不属于基本的数据类型,而是一...在Java中有字符串常量池的概念。无论是通过字面量或者是new关键字创建的字符串他都会用到字符串常量池。他们之间的创建方式有着区别和联系,而这个联系就是与常量词之间的联系。
  • 存放常智慧最新章节权法到侵答案测试树知。量的类对国现智慧盟)经典(吉期末文学林联道中当代导读答案树知。新创张玉末答业期案2臣创。智慧最新间设计和理想到居答案树知室空生活考试。线性义杜魏...
  • 【填空题】在铁碳相图中,共析点对应的含碳量为 _______ ,温度为 _______°C ;共晶点对应的含碳量为 _______ ,温度为 ________°C 。【填空题】从液体中结晶出粗大...【单选题】Java中用来存放字符串常量的对象属于( ...
  • 问题:字符串常量池分配在什么内存区域? 方法区?永久区? 堆内存?首先明晰几个概念:方法区 - java虚拟机规范的运行时数据区方法区 概念属于 java虚拟机规范的运行时数据区的一部分. 运行时数据区包括: 程序计数器、...
  • 在JDK7及以后版本,字符串常量池和静态变量在逻辑上属于方法区,实际存储在堆上。
  • 目录1 String 对象的两种创建方式2 intern() ...“abcd” 属于字符串字面量,因此编译期会在String Pool中创建一个“abcd”字符串对象,运行期返回该“abcd”字符串对象的引用; 如果String Pool 中已经有一个 “abcd
  • JAVA 字符串常量

    2014-03-10 22:33:42
    1. 首先String不属于8种基本数据类型,String是一个对象。   因为对象的默认值是...2. new String()和new String(“”)都是申明一个新的空字符串,是空串不是null;  3. String str=”kvill”;   String s
  • string是java中的字符串。String类是不可变的,对String类的任何改变,都是返回一个新的String类对象。下面介绍java中的String与常量池。1. 首先String不属于8种基本数据类型,String是一个类类型。因为对象的默认值是...
  • 常量优化机制在给一个变量赋值的时候,如果“=”的右边全部是常量(包括final关键字定义的常量在内)那么在编译阶段会把右边的结果赋值给左边的变量,如果范围不超过左边的变量类型的范围(或者说属于左边的范围)那么就...
  • 1、方法区(Method Area),又称永久代(Permanent Generation),又称非堆区(Non-Heap space) 方法区,又称永久代(Permanent Generation),常称为Perm...这些区域存储的是: 静态变量 + 常量 + 类信息(构造方..
  • JAVA 字符串常量池,jvm指令解析

    千次阅读 2016-10-20 21:03:27
    1. 首先String不属于8种基本数据类型,String是一个对象。   因为对象的默认值是null,所以String的默认值也是null;...2. new String()和new String(“”)都是申明一个新的空字符串,是空串不是null; 
  • 字符串常量池也是运行时常量池jdk1.6中,它是在方法区中,属于“永久代”jdk1.7中,它被移除方法区,放在java堆中jdk1.8中,取消了“永久代”,将常量池放在元空间,与堆独立了public classRuntimeConstantPoolOOM {...
  • python对象池python中,一切皆为对象id方法的返回值就是对象的内存地址。is运算符,如果引用的是同一个对象则返回true,x is ...Python 对小整数的定义是 [-5, 257),不包括257,属于半开半闭。这些整数对象是提前建...
  • 每花费109元人民币,只创大型复杂项目的项目管理有别于单项目管理,对于大型复杂项目管理,首先制定的计划是(36),而该计划IEEE 802.11属于()A.网络安全标准B.令牌环局域网标准C.宽带局域网标准D.无线局域网标准领导...
  • 字符串常量池也是运行时常量池 jdk1.6中,它是在方法区中,属于“永久代” jdk1.7中,它被移除方法区,放在java堆中 jdk1.8中,取消了“永久代”,将常量池放在元空间,与堆独立了 public class ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,124
精华内容 449
关键字:

属于字符串常量