白蔓青

基本上是最近看了什么写什么repo

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)

  1. 首先对float型变量取地址

  2. 强制类型转换为整型变量的地址(地址的值并没有变)

  3. 将该地址指向的变量输出(但是由于整型和浮点型数据存储方式的不同,输出结果是不同的)

     或理解成(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;

评论
© 白蔓青 | Powered by LOFTER