一、学到指针与动态数组赶紧记录一下
用new操作符为数组分配内存尤其有用,因为数组的元素个数往往是在程序运行时才能计算得出的 ——《数据结构与面向对象程序设计》(C++版)Michael Main等编著
下面是一部分简单的代码
#include<iostream>
using namespace std;
int main()
{
//动态数组的存在就是因为数组的元素个数往往在程序运行时才能确定,如number_of_element
int num_of_element;
cout << "请输入元素的个数: " << endl;
cin >> num_of_element;
double *p_ptr;
p_ptr = new double[num_of_element];
double numbers;
cout << "请输入,以负数结束:" << endl;
cin >> numbers;
for (int i = 0; numbers >= 0 && i<10; ++i)
{
p_ptr[i] = numbers;
cin >> numbers;
}
for (int i = 0; i < num_of_element; ++i)
cout << p_ptr[i] <<" ";
cout << endl;
system("pause");
}
提醒:会发现动态数组的初始化可以不是一个常量,而是在程序运行过程中确定下来的,如num_of_element.
输出:
二、动态数组元素个数确定
普通数组的元素个数:sizeof(A)/sizeof(A[0])
动态数组的元素个数:_msize(p_ptr)/sizeof(p_ptr[0])
代码:
#include<iostream>
using namespace std;
int main()
{
//动态数组的存在就是因为数组的元素个数往往在程序运行时才能确定,如number_of_element
int num_of_element;
cout << "请输入元素的个数: " << endl;
cin >> num_of_element;
double *p_ptr;
p_ptr = new double[num_of_element];
double numbers;
cout << "请输入,以负数结束:" << endl;
cin >> numbers;
for (int i = 0; numbers >= 0 && i < 10; ++i)
{
p_ptr[i] = numbers;
cin >> numbers;
}
cout << "动态数组输出如下:" << endl;
for (int i = 0; i < num_of_element; ++i)
cout << p_ptr[i] << " ";
cout << endl;
int A[]= { 11,12,13 };
cout << "数组A字节长度:"<<sizeof(A) << endl;
cout << "数组A一个元素的字节长度:" << sizeof(A[0]) << endl;//相当于sizeof(int);
cout << "数组A元素个数:"<<sizeof(A) / sizeof(A[0]) << endl;
cout << "动态数组字节长度:" << _msize(p_ptr) << endl;
cout << "动态数组一个元素的字节长度:" << sizeof(p_ptr[0]) << endl;//相当于sizeof(double);
cout << "动态数组元素个数:" << _msize(p_ptr) / sizeof(p_ptr[0]) << endl;
system("pause");
}
输出:
三、多一点点的思考
如果采用sizeof(p_ptr)会怎么样?
结果:4或8.
分析:p_ptr是一个指针!sizeof(p_ptr)表示指针的字节长度.32位操作系统是4个字节(32/8bit),64位操作系统是8个字节(64/8bit).
四、delete操作符
delete 操作符把由动态变量所使用的内存释放出来。释放出来的内存返回到内存堆中,后面可以重复使用这些内存。
① 释放整型动态变量:
int *p;
p = new int;
delete p;
② 释放整型动态数组:
int *p;
p = new int[50];
delete [] p;
提醒:用 delete[] 来释放动态数组的内存,[ ] 内不需要填写数组的大小,控制内存堆的软件会自动跟踪数组的大小。
五、编程技巧——定义指针的数据类型
可以为指针定义一个名称,这样指针变量就可以像其他变量那样进行声明了,而且在每个指针变量的前面不需要添加 * 号。例如,下面语句定义了一个名为int_pointer的数据类型,它是一种数据类型,用于定义指向 int 变量的指针变量。
typedef int* int_pointer;
int_pointer p_ptr;//定义了一个指向int数据类型的指针变量p_ptr
这种类型的定义一般出现在头文件中,或者是在主程序之前的函数原型集合中。有了这种定义,声明语句 int_pointer p_ptr 与 int* p_ptr 是等价的。 l
提醒:采用delete释放了内存堆空间之后,表示这个地址的内容已经不存在,所以不能进行访问操作,否则引发错误异常
int *p1;
int *p2;
p1 = new int;
p2 = new int;
*p1 = 100;
*p2 = 200;
cout << *p1 << " and " << *p2 << endl;
delete p1;
cout << *p1 << " and " << *p2 << endl;//*p1引发错误
参考:《数据结构与面向对象程序设计》(C++版)Michael Main等编著