首页 > 编程知识 正文

c语言符号常量的定义,c语言中判断字符串相等

时间:2023-05-05 03:12:23 阅读:120006 作者:2382

在 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);的用法不行?

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。