字符串常量

【1】字符串常量有哪些特性?

字符串常量之所以称之为常量,因为它可以看作是一个没有命名的字符串且为常量。存储于静态数据区。

常量就意味着它具有“只读”属性,不允许被修改。

静态数据区,是相对于堆、栈等动态数据区而言的。

静态数据区存放的是全局变量和静态变量。

全局变量分为常量和一般变量。

因为字符串常量不允许进行修改,放在静态内存区会提高效率。

而且其不可改变的性质与静态变量相当类似。更准确表述:存储在常量数据区。

【2】字符串常量与字符常量有何区别?

(1)字符常量由单引号括起来,字符串常量由双引号括起来。

示例代码如下:

1 char  ch='a'; 
2 char *str="abcedef";

(2)字符常量只能是单个字符,字符串常量则可以含一个或多个字符。

(3)可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。在C语言中没有相应的字符串变量。

示例代码如下:

1 char  ch;
2 ch='s';
3 ch="s";//error!!

(4)字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数加1。

增加的一个字节中存放字符"\0"(ASCII码为0)。这是字符串结束的标志。

例如:字符串 "C program"在内存中所占的字节为:C program\0。

字符常量'a'和字符串常量"a"虽然都只有一个字符,但在内存中的情况是不同的。

'a'在内存中占一个字节,可表示为:a;

"a"在内存中占二个字节,可表示为:a\0 。

(5)C语言规定,每一个字符串总是以“\0”作为字符串的结束标志。

 C语言中的字符串用字符数组来表示。

示例代码如下:

char str[]="abcdefghijk";

(6)当一个字符串常量出现在表达式中,它的值实质是个指针常量。

编译器把这些指定字符的一份拷贝存储于内存的某个位置,并存储一个指向第一个字符的指针。

而且,当数组名用于表达式中时,它们的值也是指针常量。我们可以对它们进行下标引用、间接访问、指针运算。

对于绝大多数程序员而言,它看上去象垃圾。它好象试图在一个字符串上面执行某种类型的加法运算。

但是,当你记得字符串常量实际上是个指针时,它的意义就变得清楚了。这个表达式计算“指针值加上1”的值。

它的结果是个指针,指向字符串中的第二个字符。

为了更充分的理解内容。请参照示例代码:

 1 #include<iostream>
 2 using  namespace std;
 3 
 4 void  main()
 5 {
 6     char *s="abcdefgh";
 7     //*s='p';  //编译顺利,运行崩溃..
 8     cout<<"abcde"+1<<endl;    //bcde
 9     cout<<*"abcde"<<endl;     //a
10     cout<<*("abcde")<<endl;   //a
11     cout<<s<<endl;               //abcdefgh
12     cout<<"abcdefgh"+7<<endl;    //h
13     cout<<"abcdef"[3]<<endl;     //d
14     cout<<*("abcdef"+4)<<endl;   //e
15     cout<<*"abcde"+2<<endl;      //99
16     cout<<"c"<<endl;             //c  
17     cout<<'c'<<endl;             //c
18     cout<<(int)'c'<<endl;        //99
19     ///////////////////////
20     int anum='a';
21     cout<<anum<<endl;            //97
22     
23     char ach='a';
24     cout<<ach<<endl;             //a
25     //字符数组
26     char ch[]="abcdefghijk";    
27     cout<<ch<<endl;              //abcdefghijk
28     cout<<ch+2<<endl;            //cdefghijk
29     
30     char str1[]       = "abc";   
31     char str2[]       = "abc";   
32     const char str3[] = "abc";   
33     const char str4[] = "abc";   
34     const char* str5  = "abc";   
35     const char* str6  = "abc";   
36     char* str7  = "abc";  
37     char* str8  = "abc";  
38     
39     cout << ( str1==str2 ) << endl; // 输出0
40     cout << ( str3==str4 ) << endl; // 输出0
41     cout << ( str5==str6 ) << endl; // 输出1
42     cout << ( str7==str8 ) << endl; // 输出1
43     
44 }

【3】神秘函数如何实现?

利用字符串常量的特性,根据参数值的一定比例打印相应数量的星号。它比传统的循环方案要容易的多,效率也高得多。

示例代码如下:

 1 #include<stdio.h>
 2 using  namespace std;
 3 void  mystery(int n)
 4 {
 5     n+=5;
 6     n/=10;
 7     printf("%s\n","***********"+10-n);
 8 }
 9 void  main()
10 {
11     mystery(1);
12     mystery(10);
13     mystery(20);
14     mystery(30);
15     mystery(40);
16     mystery(50);
17     mystery(60);
18     mystery(70);
19     mystery(80);
20     mystery(90);
21     mystery(100);
22 }
23 
24 //Out  print
25 /*
26 *
27 **
28 ***
29 ****
30 *****
31 ******
32 *******
33 ********
34 *********
35 **********
36 ***********
37 */

【4】整型值转换为字符输出如何实现?

示例代码如下:

 1 #include<stdio.h>
 2 using  namespace std;
 3 
 4 void binary_to_ascii(unsigned int value)
 5 {     
 6     unsigned int quotient;
 7     quotient = value/10;
 8     if(quotient!=0)
 9         binary_to_ascii(quotient);
10     putchar(value % 10 + '0');
11 }
12 
13 void main()
14 {
15     int a=100;
16     binary_to_ascii(a);  //100
17 }

【5】把十进制数据转换为十六进制如何实现?

示例代码如下:

 1 /*
 2 *把十进制数转换为十六进制
 3 */
 4 
 5 #include<stdio.h>
 6  using  namespace std;
 7 
 8 void  binary_to_ascii(unsigned int value)
 9 {
10     unsigned int  quotient;
11     quotient = value/16;
12     if(quotient!=0)
13         binary_to_ascii(quotient);
14     putchar("0123456789ABCDEF"[value % 16]);
15 
16 }
17 
18 void main()
19 {
20     binary_to_ascii(10);
21     binary_to_ascii(20);
22     binary_to_ascii(30);    
23     binary_to_ascii(40);    
24     binary_to_ascii(16);
25     binary_to_ascii(17);
26     binary_to_ascii(100);
27 }
28 //运行结果如下:
29 /*
30 A
31 14
32 1E
33 28
34 10
35 11
36 64
37 */

 

 

作者:kaizen
声明:本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此声明,且在文章明显位置给出本文链接,否则保留追究法律责任的权利。
签名:顺序 选择 循环
原文地址:https://www.cnblogs.com/Braveliu/p/2840616.html