1.解析p159
#include <iostream> using namespace std; int main(){ //Part I char *s[]={"nanjingnanyouknow"}; //win下char *的大小为4,mac下char *大小为8 //大小和CPU的使用相关 char *s1[]={"n"}; char *s2[]={"n1","n2"}; char *str={"nanjingUniversity"}; char *str1={"n"}; //Part II char a1[]="seuBME"; //数组的内存空间要算上\0的一个 //char类型占一个字节 char a10[]={"seuBME"}; //和char a1[]="seuBME";是等价的 char a11[]={'s','e','u','B','M','E','\0'}; //同上一行注解 char a12[]={'s','e','u','B','M','E'}; //和前面三种写法结果不一致 char a2[10]="seu"; //声明10个元素的数组空间就为10个,包括\0在内 //Part I' cout<<" "<<"Part I"<<endl; cout<<"[]sizeof(s)"<< sizeof(s)<<endl; //占的内存空间 cout<<"[]sizeof(*s)"<<sizeof(*s)<<endl; //第一个元素的内存空间 cout<<"[]sizeof(s1)"<< sizeof(s1)<<endl; cout<<"[]sizeof(*s1)"<< sizeof(*s1)<<endl; cout<<"[]sizeof(s2)"<< sizeof(s2)<<endl; cout<<"[]sizeof(*s2)"<< sizeof(*s2)<<endl; //Part II' cout<<" "<<"Part II"<<endl; cout<<"sizeof(str)"<< sizeof(str)<<endl; cout<<"sizeof(*str)"<< sizeof(*str)<<endl; cout<<"strlen(*str)"<<strlen(str)<<endl; cout<<"sizeof(str1)"<< sizeof(str1)<<endl; cout<<"sizeof(*str1)"<< sizeof(*str1)<<endl; cout<<"strlen(*str1)"<<strlen(str1)<<endl; //字符串的长度,不算最后的\0 cout<<"a1[]sizeof(a1)"<<sizeof(a1)<<endl; cout<<"a10[]sizeof(a10)"<<sizeof(a11)<<endl; cout<<"a11[]sizeof(a11)"<<sizeof(a11)<<endl; cout<<"a12[]sizeof(a12)"<<sizeof(a12)<<endl; cout<<"a2[10]sizeof(a2)"<<sizeof(a2)<<endl; //Part III' cout<<" "<<"Part III"<<endl; cout<<"sizeof(\"abcde\")"<<sizeof("abcde")<<endl; return 0; }
输出结果为:
Part I
[]sizeof(s)8
[]sizeof(*s)8
[]sizeof(s1)8
[]sizeof(*s1)8
[]sizeof(s2)16
[]sizeof(*s2)8
Part II
sizeof(str)8
sizeof(*str)1
strlen(*str)17
sizeof(str1)8
sizeof(*str1)1
strlen(*str1)1
a1[]sizeof(a1)7
a10[]sizeof(a10)7
a11[]sizeof(a11)7
a12[]sizeof(a12)6
a2[10]sizeof(a2)10
Part III
sizeof("abcde")6
Process finished with exit code 0
2.strcmp函数和strcpy函数
strcmp函数:
①字符串1小于字符串2,strcmp函数返回一个负值;
②字符串1等于字符串2,strcmp函数返回零;
③字符串1大于字符串2,strcmp函数返回一个正值;
实际上,字符串的比较是比较字符串中各对字符的ASCII码。首先比较两个串的第一个字符,若不相等,则停止比较并得出大于或小于的结果;如果相等就接着 比较第二个字符然后第三个字符等等。如果两上字符串前面的字符一直相等,像"disk"和"disks" 那样, 前四个字符都一样, 然后比较第 五个字符, 前一个字符串"disk"只剩下结束符'/0',后一个字符串"disks"剩下's','/0'的ASCII码小于's'的ASCII 码,所以得出了结果。因此无论两个字符串是什么样,strcmp函数最多比较到其中一个字符串遇到结束符'/0'为止,就能得出结果。
strcpy函数:
strcpy函数用于实现两个字符串的拷贝。一般形式是:
strcpy(字符中1,字符串2)
其中,字符串1必须是字符串变量,而不能是字符串常量。strcpy函数把字符串2的内容完全复制到字符串1中,而不管字符串1中原先存放的是什么。复制后,字符串2保持不变。
3.字符串相关
字符串声明:
#include <iostream> using namespace std; int main(){ char *oldC="seuBME"; cout<<oldC<<endl; char a[]="seuee"; cout<<*a<<endl; cout<<a<<endl; return 0; }这里,输出
seuBME
s
seuee
Process finished with exit code 0
字符串常量&字符串变量:
字符串常量指的是,初始时用" "赋值的字符串。
字符串变量可以对值进行修改,字符串常量不能。
输入:
#include <iostream> using namespace std; int main(){ //From char str[10]; //字符串 变 量 char str1[]="abcd"; //字符串 变 量 char str2=48; //字符串 变 量 char *str3="abcde"; //字符串【常】量 char c='a'; //字符串 变 量 cout<<"From"<<endl; cout<<"str1="<<str1<<endl; cout<<"str2="<<str2<<endl; cout<<"str3="<<str3<<endl; cout<<"c="<<c<<endl; //Latter *str = 'z'; //字符串变量可以对值改变,字符串常量不能改变 *str1 = 'z'; str2 = 'z'; c= 'z'; cout<<endl<<"Latter"<<endl; cout<<"str="<<str<<endl; cout<<"str1="<<str1<<endl; cout<<"str2="<<str2<<endl; cout<<"str3="<<str3<<endl; cout<<"c="<<c<<endl; return 0; }输出:
From
str1=abcd
str2=0
str3=abcde
c=a
Latter
str=z
str1=zbcd
str2=z
str3=abcde
c=z
Process finished with exit code 0
4.字符串的定义和更改
输入:
#include <iostream> using namespace std; int main(){ char a[]="bme"; //字符串变量,可以改变 char *p=&a[0]; //指针p指向a[0] char *p1= a; //指针p1指向a[0] *a = 'e'; //改变字符串变量的值,这里改变的是一个值,即a[0] //a[]是数组类型,不能一次改变全部的值 //如 a = "seu" 是错误的 p = "nupt"; //这里是将指针指向新的变量,即新的字符串nupt //并非改变数组a的值 cout<<"a="<<a<<endl; cout<<"p="<<p<<endl; cout<<"p1="<<p1<<endl; return 0; }
输出:
a=eme
p=nupt
p1=eme
Process finished with exit code 0
5.为什么 sizeof("1234\056") 的值是6,而sizeof("abcd\0sf")的值是8。
A:
"1234\056"依次包含:'1'、'2'、'3'、'4'、'\056'、'\0',共计6字符。
"abcd\0sf"依次包含:'a'、'b'、'c'、'd'、'\0'、's'、'f'、'0',共计8字符。