字符串常量
【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 */