C++指针


1、声明指针

typename * pointername		例:double * pd; char * pc;

2、给指针赋值

将内存地址赋给指针,可以对变量名应用 & 取地址运算符,来获得被命名的内存的地址,new 运算符返回未命名的内存的地址。
例:double *pd;
pd = &a;				//将变量a的地址赋给pd
pd = new double			//将获取一个地址赋给pd
pd = new double [10];	//获取10个地址并将首地址赋给pd

3、对指针接触引用

对指针接触引用意味着获得指针指向的值。对指针应用接触引用或间接值运算符( * ),来解除引用。如上例 将pd指向a,则*pd为	pd指向的值即为a的值
另一种对指针解除引用的方法是使用数组表示法,例如,pd[0] 与 *pd 是一样的。
绝不要对未被初始化为适当地址的指针解除引用

4、区分指针和指针所指向的值

如果 pt 是指向 int 的指针,则 *pt 不是指向 int 的指针,而是完全等同于一个 int 类型的变量。pt 才是指针
int* pt = new int 		//为pt获取一个新地址
*pt = 5 ;				//  将5赋给pt所指向的内存

5、数组名

在多数情况下,C++将数组名视为数组的第一个元素的地址。
int arr[10];
arr 表示数组首位置的地址
&arr 表示40个字节的位置
sizeof(arr)返回整个数组的长度;

6、指针算数

C++允许指针和整数相加。加 1 的结果等于原来的地址值加上指向的对象占用的总字节数。还可以将一个指针减去另一个指针,获得两个指针的差		

后一种运算将得到一个整数,仅当两个指针指向同一个数组(也可以指向超出结尾的一个位置)时,这种运算才有意义;这将得到两个元素的间隔

int tacos[10] = {5,2,8,4,1,2,2,4,6,8}
int* pt = tacos			//定义一个指针 pt 指向 tacos 的首位置  此时 *pt = 5
pt = pt +1 				//指针 pt 指向的位置加 4 个字节  此时 *pt = 2
int* pe = &tacos[9]		//定义一个指针 pt 指向 tacos[9]所在的位置 ,此时 *pe = 8;
pe = pe -1 ;			//指针 pt 指向的位置减 4 个字节,此时 *pt = 6;
int diff = pe - pt		//diff =7, pe指向的位置距pt指向的位置 7*4 = 28 个字节

7、数组的动态联编和静态联编

使用数组声明来创建数组时,将采用静态联编,及数组的长度在编译时设置
int tacos[10];
使用new[ ];运算符创建数组时,将采用动态联编(动态数组),即在运行时为数组分配空间,其长度也将在运行时设置。
使用完这种数组后,应使用	delete[] 释放其占用的内存:
int size ;
cin >> size;
int * pz = new int [size];
……
delete pz [];

8、数组表示法和指针表示法

使用方括号数组表示法等同于对指针接触引用:
tacos [0]  在 tacos 地址的值 
tacos [3]  在tacos + 3 地址的值
对于指针和数组名,既可以使用指针表示法,也可以使用数组表示法:
int* pt = new int [10]
*pt = 5;				//set element number 0 to 4
pt [0] = 6;				//set element number 0 to 6
pt [9] = 44;			//set tenth element (element number 9) to 44
int coats [10];
*(coats + 4) = 12;	//set coats [4] to 12
/*
分配内存: new  数据类型(数据)
接触内存: delete  地址
*/

9、new操作符为指针申请内存空间与delete释放内存

/*
分配内存: new  数据类型(数据)
解除内存: delete  地址
*/

#include<iostream>
#include<cmath>
using namespace std;

//new 的基本语法
int len;
int* func()
{
	//在堆区创建整形数据
	//new 返回 该数据类型的指针
	int* p = new int(10);
	return p;//返回指针
}

void ShowValue()
{
	int* p = func();
	cout << *p << "\t" << p << endl;
	delete p; //释放指针 p 指向的空间 ,之后 指针 p 成为了一个野指针
	//cout << *p << "\t" << p << endl;  //非法操作
}

int* func1()
{
	//动态数组
	cin >> len;
	int* arr = new int[len];	//向内存申请len个内存空间 arr 接收内存的首个地址
	return arr;					//返回首个内存地址;
}

void ShowArray()
{
	int* arr = func1();			 // 接收内存
	for (int i = 0; i < len; i++)
	{
		arr[i] = i;
	}

	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << " ";
}

delete[] arr;					//释放内存

	/*for (int i = 0; i < 10; i++)
	{
		cout << arr[i] << " ";
	}*/							 //非法操作
}

int main()
{
	ShowValue();
	ShowArray();
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值