C++学习之符合类型(5)

1.(数组)如果给cout提供一个字符的地址,则它将从该字符开始打印,直到遇到空字符。

2.

char flower[10] = "rose";
cout<<flower<<"s are red\n";

为了与cout对字符串输出的出来保持一致,这个引号括起来的字符串也应当是一个地址。

在C++中,用引号括起来的字符串像数组名一样,也是第一个元素的地址。上述代码不会将整个字符串发送给cout,而只是发送该字符串的地址。

3.

有些编译器将字符串字面值视为只读常量,如果试图修改他们,将导致运行阶段错误。在C++中,字符串字面值都将被视为常量,但并不是所有的编译器都对以前的行为做出了这样的修改。

有些编译器只使用字符串字面值的一个副本来表示程序中所有的该字面值。

4.

    ps = animal;
	cout << ps << "\n";
	cout << "Before using strcpy()" << endl;
	cout << animal << "at" << (char *)animal << endl;
	cout << ps << "at" << (int *)ps << endl;

一般来说,如果给cout一个指针将打印出来地址。但是如果指针类型为char*,则cout将显示指向的字符串。所有如果要显示它对应的地址,则需要将这种指针类型强制转化为另一种(图上animal就是char *类型的指针)

并且animal赋给ps并不会复制字符串,而只是复制地址。

5.strcpy()使用

char food[20]="carrots";
strcpy(food,"flan");

注意,类似下面的问题可能会导致问题,因为food数组比字符串小。

strcpy(food,"a picnic basket filled with many goodies");

在这种情况下,函数将字符串中剩余的部分复制到数组后面的内存字节中,这可能会覆盖程序正在使用的其他内存。要避免这些问题,请使用strncpy()。该函数还接受第三个参数——要复制的最大字符数。然而,要注意的是,如果该函数在到达字符串结尾之前,目标内存已经用完,则他不会添加空字符。因此,应该这样来使用函数:

strncpy(food,"a picnic basket filled with many goodies",19);
food[19]='\0';

6.建立动态结构

将new用于结构有两步组成:创建结构和访问结构。要创建结构,需要同时使用结构类型和new。例如,要建立一个未命名的inflatable类型,并将其地址赋给一个指针,可以这样做:

intflatable * ps = new inflatable;

访问成员变量时应该用(->)该运算符由连字符和大于号组成,例如:

ps->price

删除ps的话就直接删去

delete ps;

7.自动储、存静态存储和动态存储

  • 自动储存——在函数内部定义的常规变量使用自动存储空间,称为自动变量。这就意味着它们在所属的函数被调用时自动产生,在该函数结束时消亡。
  • 静态存储——静态存储是整个程序执行期间都存在的存储方式。使变量成为静态的方式有两种:一种是在函数外面调用它;另一种是在声明变量时使用关键字static。
  • 动态存储——new和delete运算符提供了一种比自动变量和静态变量更灵活的方法。他们管理一个内存池,这在C++中被称为自由存储空间或堆。

8.数组的替代品

举个例子就好了,在这里就不详细将模板类vector和模板类array

#include<iostream>
#include<vector>
#include<array>

int main(void)
{
	using namespace std;
	//c,original C++
	double a1[4] = { 1.2, 2.4, 3.6, 4.8 };
	//C++98STL
	vector<double> a2(4);//vector<typeName> vt(n_elem)
	//no simple way to initialize in C98
	a2[0] = 1.0 / 3.0; a2[1] = 1.0 / 5.0; a2[2] = 1.0 / 7.0; a2[3] = 1.0 / 9.0;
	//c++11--create and initialize array object
	array<double, 4>a3 = { 3.14, 2.72, 1.62, 1.41 };
	array<double, 4>a4;//array<typeName,n_elem>n_elem不能为变量
	//use array notation
	cout << "a1[2]:" << a1[2] << "at" << &a1[2] << endl;
	cout << "a2[2]:" << a2[2] << "at" << &a2[2] << endl;
	cout << "a3[2]:" << a3[2] << "at" << &a3[2] << endl;
	cout << "a4[2]:" << a4[2] << "at" << &a4[2] << endl;
	//misdeed
	a1[-2] = 20.2;//找到a1所指的位置,向前移动两个double元素,并将20.0存储到目的地,也就是说,将信息存储到数组的外面。
	//c++也不会检查这种超界的错误。
	//在这个事例中这个位置在对象a3中。
	cout << "a1[-2]:" << a1[-2] << "at" << &a1[-2] << endl;
	cout << "a3[2]:" << a3[2] << "at" << &a3[2] << endl;
	cout << "a4[2]:" << a4[2] << "at" << &a4[2] << endl;
	return 0;

}

猜你喜欢

转载自blog.csdn.net/qq_38721302/article/details/82927623