4.20
#include<iostream>
#include<cstring>
int main()
{
using namespace std;
char animal[20]="bear";
const char * bird="wren";//1
char *ps;//2
cout<<animal<<"and";
cout<<bird<<"\n";//3
cout<<"enter a kind of animal:";
cin>>animal;
ps=animal;
cout<<ps<<"!\n";
cout<<"before using strcpy():\n";
cout<<animal<<"at"<<(int*)animal<<endl;//4
cout<<ps<<"at"<<(int*)ps<<endl;//4
ps=new char[strlen(animal)+1];//6 、7
strcpy (ps,animal);//6
cout<<"after using strcpy():\n";
cout<<animal<<"at"<<(int*)animal<<endl;
cout<<ps<<"at"<<(int*)ps<<endl;
delete [] ps;//8
return 0;
}
1、
"wren"实际表达的是字符串的地址,因此这条语句将"wren"的地址赋给了bird指针。可以像使用字符串"wren"那样使用指针bird,如:cout<<"A concerned"<<bird<<"speaks\n";
字符串字面值是常量,因此以这种方式使用const,意味着可以用bird来访问字符串,但不能改变他。
const char * p(p is a pointer to const char;) p指向的内容是常量,p是变量,定义出来的指针可以p++但*p='3' 不合法
char * const p(p is a const pointer to char) 指针p为常量 指针指向内容可以是变量。即 p++不合法 而*p='3' 合法
2、
由于ps没有被初始化,它可能有任何值,无法控制它如何被使用,因此一定要在对指针应用解除引用运算符(*)之前,将指针初始化为一个确定的、适当的地址。
3、
c++中,用引号括起来的字符串常量、char数组名、char 指针,都被解释为字符串第一个字符的地址,而如果给cout提供一个字符的地址,则它将从该字符开始打印,直到遇到空字符为止。
4、
一般来说,如果给cout提供一个指针,它将打印地址。但如果指针的类型为char*,则cout将显示指向的字符串,而(int*)是将一个变量(此变量不能是浮点型,可以是整型、字符、指针)以地址的形式显示。
即,(int*)在输出字符数组的首地址时十分有用。
将animal赋给ps并不会复制字符串,而只是复制地址。这样,两个指针将指向相同的内存单元和字符串。
5、
float a = 1.0f;
cout << (int)a << endl;//1
cout << (int&)a << endl;//1065353216
cout << boolalpha << ( (int)a == (int&)a ) << endl; // false
(int&)a==*(int*)(&a)
首先对float型变量取地址
强制类型转换为整型变量的地址(地址的值并没有变)
将该地址指向的变量输出(但是由于整型和浮点型数据存储方式的不同,输出结果是不同的)
或理解成(int&)a告诉编译器将a当作整数(并没做任何实质上的转换)
(int)a
1以整数形式存放和以浮点形式存放其内存数据是不一样的
6、
动态连编:如果在运行阶段需要数组,则创建它,还可选择数组长度。
strlen( )确定所需空间,new来获得可用内存,且有足够的空间储存副本。
strcpy ( )函数接受两个参数,第一个是目标地址,第二个是要复制的字符串地址。(不要继续再被之前的书坑了啊!!!不只是数组名。)(是复制不是连接)
通过strcpy和new获得两个独立的"fox"副本,另,new在离animal数组很远的地方找到了所需内存空间。
7、
strncpy( )接受第三个参数——要复制的最大字符串。如果函数在到达被复制字符串结尾前,目标内存已用完,则它不会自己添加空字符。
strncpy(food,"a picnic basket filled with many goodies",19);
food[19]='\0';
8、
delete只释放new分配的内存
释放指针指向的内存,并不会删除指针本身
不要释放已释放的内存块
int * pt=new int;
short *ps=new short [500];
delete pt;
delete [] ps;