在 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字节字符类型参与算术运算
字符类型可以视为非常短的整数,因此可以对字符类型和整数进行算术运算。
#includestdio.hintmain(void ) ) printf ) ' %dn ',' A' 2); printf(%c(n )、(a ) 2; }上述程序输出:
67C字符类型涉及算术运算,实际上是对与字符对应的ASCII码进行算术运算。 与字符' a '对应的ASCII代码为65,该' A' 2以十进制输出有符号整数的结果为67; ASCII代码值为67的字符必须为' c ',该' A' 2输出为1个字符的结果必须为c。
n——分行,
t——选项卡,
r——回车、
f更改第f——页,然后单击,
(b——退出、
ddd——1中以三位八进制表示的字符
二、字符串常数:两种定义方式:
(字符数组)数组方式定义字符串。 如果在表达式中使用数组名称,则该值也是指针常量。 可以进行下标引用、间接访问、指针运算。
(字符串指针)指针常数定义字符串)字符串常数出现在表达式中时,其值为指针常数。 编译器将指定字符的副本保存在内存中的某个位置,并保存指向第一个字符的指针。 (一个是指针地址,另一个是字符串地址)
1、
char str[]='hello,world '; str[1]='a '; 2,
char *str='hello,world '; str[1]='a '; 这两个程序都可以编译,但第二次运行时会发生段错误。
两个程序的区别如下。
第一个程序的str是初始化变量,str是堆栈上的内存区域(如果是局部变量),str是静态变量或全局变量,则是进程的data段内存区域。data段权限为可读、可写;
第二个程序的' hello,world '是字符串面的量,str确实指向该地址,但该地址位于进程的text段,http://www.Sina.com
实例:
char p[]='hello '; //方式1char *p='hello '; //方式2char *p; p=(char* ) malloc(sizeof ) char ) *6); srcpy(p,' hello ' ); //方式3的3种情况:
方式1:6个char字符全部连续存储在堆栈区域。text
方式2(Hello )不允许可写权限的,而是只允许可读、可执行权限是编译时固定的)内容可更改!),以及存在程序内存的常量区中。
方式3: malloc向堆申请了空间。不可更改
rong>,指向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"; // 方式1printf("输出数组定义字符串:%sn",p0);printf("输出数组定义字符串地址:%pn",p0);//更改数组P0中的某一个元素p0[0] = 'H';printf("输出数组定义字符串:%sn", p0);/*printf("t方式2……n");char *p1 = "hello"; // 方式2printf("输出指针定义字符串:%sn", p1);printf("输出指针定义字符串地址:%pn", &p1);//更改数组P1中的某一个元素p1[0] = 'H';printf("输出指针定义字符串:%sn", p1);*/printf("t方式3……n");char *p2;// 方式3p2 = (char *)malloc(sizeof(char) * 6);strcpy(p2, "hello");printf("输出指针定义字符串:%sn", p2);printf("输出指针定义字符串地址:%pn", &p2);//更改数组P2中的某一个元素p2[0] = 'H';printf("输出指针定义字符串:%sn", p2);return 0;}运行结果:
示例代码:
#include <stdio.h>#include <string.h>int main() {printf("t方式1……n");char p0[] = "hello"; // 方式1printf("输出数组定义字符串:%sn",p0);printf("输出数组定义字符串地址:%pn",p0);//更改数组P0中的某一个元素p0[0] = 'H';printf("输出数组定义字符串:%sn", p0);printf("t方式2……n");char *p1 = "hello"; // 方式2printf("输出指针定义字符串:%sn", p1);printf("输出指针定义字符串地址:%pn", &p1);//更改数组P1中的某一个元素p1[0] = 'H';printf("输出指针定义字符串:%sn", p1);printf("t方式3……n");char *p2;// 方式3p2 = (char *)malloc(sizeof(char) * 6);strcpy(p2, "hello");printf("输出指针定义字符串:%sn", p2);printf("输出指针定义字符串地址:%pn", &p2);//更改数组P2中的某一个元素p2[0] = 'H';printf("输出指针定义字符串:%sn", p2);return 0;}方式2可以编译,但运行会出现错误
运行结果:
C语言中字符串常量的问题
如下示例,表明不同的字符串所在的内存位置不一样,故不相等
C/C++对字符串常量的处理策略
指针常量示例:
【 C 】彻底学会字符串常量
示例代码:
/*#include <stdio.h>int main() {char *p_char = "Hello World";printf("输出字符串:%sn",p_char);printf("输出指针指向字符串的地址:%pn",&p_char);printf("输出字符串:%cn", p_char[1]);p_char[1] = 'H';printf("输出字符串:%sn", p_char);//printf("输出指针指向字符串的地址:%pn", &(p_char+1));char str[] = "I Love Beijing";printf("输出数组定义字符串:%sn",str);printf("输出数组定义字符串地址:%pn",str);return 0;}*//*#include <stdio.h>#include <string.h>int main() {printf("t方式1……n");char p0[] = "hello"; // 方式1printf("输出数组定义字符串:%sn",p0);printf("输出数组定义字符串地址:%pn",p0);//更改数组P0中的某一个元素p0[0] = 'H';printf("输出数组定义字符串:%sn", p0);printf("t方式2……n");char *p1 = "hello"; // 方式2printf("输出指针定义字符串:%sn", p1);printf("输出指针定义字符串地址:%pn", &p1);//技巧:printf("输出指针定义字符串:%cn", *"hello");printf("输出指针定义字符串:%cn", *("hello"+1));printf("输出指针定义字符串:%cn", *(p1 + 1));//更改数组P1中的某一个元素p1[0] = 'H';printf("输出指针定义字符串:%sn", p1);printf("t方式3……n");char *p2;// 方式3p2 = (char *)malloc(sizeof(char) * 6);strcpy(p2, "hello");printf("输出指针定义字符串:%sn", p2);printf("输出指针定义字符串地址:%pn", &p2);//更改数组P2中的某一个元素p2[0] = 'H';printf("输出指针定义字符串:%sn", p2);return 0;}*/#include <stdio.h>#include <string.h>int main() {printf("t方式1……n");char p0[] = "hello"; // 方式1printf("输出数组定义字符串:%sn", p0);printf("输出数组定义字符串地址:%pn", p0);//更改数组P0中的某一个元素p0[0] = 'H';printf("输出数组定义字符串:%sn", p0);printf("t方式2……n");char *p1 = "hello"; // 方式2printf("输出指针定义字符串:%sn", p1);printf("输出指针定义字符串地址:%pn", &p1);//技巧:printf("输出指针定义字符串:%cn", *"hello");printf("输出指针定义字符串:%cn", *("hello" + 1));printf("输出指针定义字符串:%cn", *(p1 + 1));//更改数组P1中的某一个元素p1[0] = 'H';printf("输出指针定义字符串:%sn", p1);return 0;}运行结果:
C语言字符常量与字符串常量
来自知乎的提问:
为什么char *a="xxxxx", *b="xxx"; strcpy(a, b);的用法不行?