指针与动态数组初步+动态数组元素个数确定方法

一、学到指针与动态数组赶紧记录一下


用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等编著


 

### C语言中动态数组的实现 在C语言中,动态数组是一种可以在运行根据需求调整其大小的数据结构。其实现主要依赖于`malloc()`、`realloc()`以及`free()`等函数。 #### 动态数组的核心概念 动态数组的关键在于能够灵活地分配和重新分配内存空间。以下是具体的操作过程: 1. **使用 `malloc()` 分配初始内存** 利用 `malloc()` 函数可以为动态数组分配一块连续的内存区域。该函数返回指向这块内存起始位置的指针。 ```c int *arr = (int *)malloc(size * sizeof(int)); ``` 这里,`size` 表示所需整型数据的数量[^3]。 2. **利用 `realloc()` 调整内存大小** 当需要扩展或缩减动态数组的容量,可使用 `realloc()` 函数。此函数允许修改已分配内存块的大小而不丢失原有数据。 ```c arr = (int *)realloc(arr, new_size * sizeof(int)); ``` 如果原指针有效,则新旧内存之间会自动完成数据复制;若传入的是 `NULL`,则行为类似于 `malloc()`[^5]。 3. **访问操作动态数组元素** 和静态数组一样,可以通过下标索引来读写动态数组中的各个元素。 ```c arr[0] = 10; arr[1] = 20; ``` 4. **释放不再使用的内存** 完成对动态数组的操作之后,务必调用 `free()` 来回收之前分配出去的资源,防止发生内存泄漏。 ```c free(arr); ``` 以上步骤构成了完整的动态数组生命周期管理流程。 #### 示例代码展示 下面给出一段综合运用上述技术创建并处理动态数组的例子: ```c #include <stdio.h> #include <stdlib.h> int main(){ int n,new_n,i,*p; // 获取用户输入确定初步规模n printf("请输入原始长度:"); scanf("%d",&n); p=(int*)malloc(n*sizeof(int));//初次分配存储区给p if(!p){ fprintf(stderr,"无法获取足够的内存\n"); exit(EXIT_FAILURE); } for(i=0;i<n;i++) { *(p+i)=rand()%100;//填充随机数值到各单元格内 } printf("当前内容:\n"); for(i=0;i<n;i++) printf("%d ",*(p+i)); // 请求新的尺寸new_n printf("\n现在设定更大的长度:"); scanf("%d",&new_n); p=realloc(p,new_n*sizeof(int));//尝试扩大范围至new_n项 if(!p && new_n !=0 ){ fprintf(stderr,"未能成功重设内存大小\n"); exit(EXIT_FAILURE); } //补充新增部分值 for(;i<new_n;i++) *(p+i)=(i-n)*(-7)+88 ; printf("\n更新后的列表如下所示:\n"); for(i=0;i<new_n;i++) printf("%d ",*(p+i)); free(p);//最后记得清理掉所占有的堆上区块 return EXIT_SUCCESS; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值