C/C++中的const;指针数组;数组指针;迷途指针;空指针和迷途指针的区别;C++中已经有了malloc/free,为什么还需要new/delete?

//分文件

//在C情况下
#pragma once
const int a = 10;
#include<stdio.h>
int main ()
{
	extern a;
	printf ("%d",a);
	return 0;
}
//在C++情况下
#pragma once
extern const int a = 10;
#include<iostream>
using namespace std;
int main ()
{
	extern const int a;
	cout <<a;
	return 0;
}
extern a;
extern const int a;
c/c++这里的区别大概是因为c++类型要求更严格
const int a = 10;
extern const int a = 10;
因为在c中const默认是外部连接,而c++是内部连接,加上extern可以变为外部连接
并且在c中可以直接const s = 10;不加类型,c++不可以
因为C语言中const的意思是一个不能被修改的普通变量,它本身就是一个变量
在C语言中const不是很有用
数据对齐指的是数据所在的内存地址必须是该数据长度的整数倍。
int(*(p)(int ,int))(int)     //p是一个函数指针,指向参数为int,int的函数,并且返回值是一个函数指针的函数,这个函数又指向一个参数为int并且返回值是int的函数

指针数组和数组指针对数组的内容的读取

#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
	 int(*A)[3],(*B)[3];
 	int p = 5, p2 = 6;
 	int text[2][3] = { { 1, 2, 3 },{ 4, 5, 6 } };
	 int text2[3] = { 1, 2, 3 };
 	A = &text[1];
 	B = &text2;
	 cout << (*A)[0] << (*A)[1] << (*A)[2] << endl;	
 	cout << (*A) << endl;
 	cout << (A[0]) << endl;
 	cout << (*B)[2] << endl;    //在读取数组内容的时候必须先对A或者B进行解引用,才可以读取,因为AB是指针要解引用后才可以读取数组的内容。
 	return 0;
}

//结果:
456
004FF8F0
004FF8F0
3
#include<iostream>
using namespace std;
int main()
{
 	int *a[2];
 	int *p1, *p2;
 	int b = 1, c = 2;
 	p2 = &c;
 	a[0] = &b;
	a[1] = p2;
 	cout	<< *a[0] << *a[1] << endl;    //注意这里是如何进行读取内容的,这里也需要解引用但是是对数组内容解引用,因为数组内容都是int *类型的
 	cout << *p2;
 	return 0;
}

了解指针数组和数组指针解引用的含义,指针数组的解引用是因为,数组的内容都是指针,解引用是对内容进行解引用,而数组指针是因为,本身就是指针要对指针进行解引用之后才可以读取内容,也就是为什么数组指针要加()的原因。并且好像无论是指针数组还是数组指针都无法一次性输出数组中所用的数据,必须
[0],[1],[2],[3].一个一个来读取。

编程中一种很难发现的错误就是迷途指针,迷途指针也叫悬浮指针,也叫失控指针,是当对一个指针进行 delete操作之
后------这样会释放它所指向的内存----并没有设置为空产生的。而后,如果你没有重新赋值就试图再次使用该指针,
引起的结果是不可预料的。程序崩溃算你走运。
当delete一个指针的时候,实际上仅是让编译器释放了一次内存,但指针本身依然存在。这时他就是一个迷途指针,
当使用下面的语句可以让迷途指针改为空指针p = 0;通常,如果在删除了一个指针后又把它删除了一次,程序就会变非常不稳定,
任何情况都有可能发生。但是如果你只是删除了一个空指针,则什么都不会发生,这样做是非常安全的。
	unsigned short *p = new unsigned short;
 	*p = 10;
 	delete p;
  	delete p;
  	这段代码就会不稳定甚至崩溃。
直接使用迷途指针或者空指针是非法的,也就是说在不指明指针指向内存的情况下,直接使用指针是非常危险的,也是非法的,
如果指针是空指针,尽管同样是崩溃,但是他同迷途指针造成的崩溃相比是一种可预测的崩溃,这样调试起来也会方便很多。
malloc与free是C/C++语言的标准库函数,new/delete是c/c++的运算符。他们可以用于申请动态的内存和释放内存。对于非内部数据类
型的对象而言,也就是自定义类型,光用无法满足动态对象的要求。对象在创建的时候要自动执行构造函数,对象在消亡之前就要自动
执行析构函数。由于malloc/free是库函数而不算是运算符,不在编译器控制权限只能,不能够把执行构造函数和析构函数的任务强加于
malloc/free.
因此c++需要一个能完成动态能存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete.new/delete不
是库函数而是运算符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值