概述
一、定义指针
符号&为取址符号,用于获取地;符号*用于定义指针。
如下代码所示:
int higgens = 5;
int* pt = &higgens; //指针变量*pt自身有一个地址 即&pt,
//pt存储地址&higgens,*pt则对应higgens的值
cout << "higgens:" << higgens << endl; //5
cout << "&higgens:" << &higgens << endl; //higgens的地址
cout << "*pt:" << *pt << endl; //5
cout << "pt:" << pt << endl; //输出pt存储higgens的地址
higgens = 10;
cout << *pt << endl; //10,*pt的值始终随higgens改变而改变,
//因为*pt指向的是higgens的地址
二、数组指针
数组名就是数组首元素的地址,所以 *数组名 就可以用于访问数组第一个元素,*(数组名=+1)则为第二个元素地址,以此类推可访问数组元素。
//数组指针!!!
int abc[3] = { 1,2,3 }; //定义一个int型数组
cout << abc[1] << endl; //2
cout << abc << endl; //第一个元素的地址
cout << (abc + 1) << endl; //第二个元素的地址
cout << *(abc + 1) << endl; //2
三、占用空间
任意数据类型,32位下占用4字节,64位占用8字节。
空指针,一般用于初始化指针变量
//空指针
//空指针不允许进行访问,0~255的内存空间是系统占用的,不可以访问。
int* p = NULL;//空指针
四、const修饰指针
1.const修饰指针:常量指针
const修饰的是指针
特点:指针的值不可以改,指针的指向可以改。
//const修饰指针
int a = 10;
int b = 20;
//常量指针
const int* p = &a;//指针的指向可以修改,但值不可以修改。
cout << *p << endl;//10
//*p = 20;//这是错误的,指向的值不可以修改。
p = &b;//通过改变变量p存储的地址来改变指向的值
cout << *p << endl;//20
2.const修饰常量:指针常量
const修饰的是常量
特点:指针的指向不可以改,指针指向的值可以改。
//指针常量,指针的指向不可以改,指针指向的值可以改
int c = 10;
int d = 20;
int* const p = &c;
cout << *p << endl;//10
*p = 20;//指向的值可以改
cout << *p << endl;//20
//p = &d;//错误,指向不可以改
3.const既修饰指针,又修饰常量。
特点:指针的指向不可以改,指针指向的值可以改。
//const既修饰指针又修饰常量
const int* const p3 = &c;
//指针的指向不可以改,指针指向的值不可以改
五、指针和函数
1、值传递
#include <iostream>
#include <cstring>
using namespace std;
void jiaohuan(int a, int b)
{
int temp = a;
a = b;
b = temp;
//形参
cout << "a=" << a << endl;
cout << "b=" << b << endl;
}
int main()
{
//指针和函数
//值传递
//定义交换值的函数
int a = 10;
int b = 20;
jiaohuan(a, b); //输出a=20,b=10
//实参
cout << "a="<< a << endl; //10
cout << "b="<< b << endl; //20
}
2、地址传递
指针存放在栈中,栈的访问效率高于堆
#include <iostream>
#include <cstring>
using namespace std;
void jiaohuan(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
//形参
cout << "a=" << *a << endl;
cout << "b=" << *b << endl;
}
int main()
{
//指针和函数
//值传递
//定义交换值的函数
int a = 10;
int b = 20;
jiaohuan(&a, &b); //输出a=20,b=10
//实参
cout << "a=" << a << endl;
cout << "b=" << b << endl;
}
六、new为指针分配内存
//使用new为指针分配内存
int nights = 1001;
int* p_nights = new int; //为int型指针*p_nights寻找一个存执int型的地址,返回给p_nights
*p_nights = nights; //给指针变量赋值1001
cout << "&nights:" << &nights << endl; //&nights:0115FB08 变量nights的地址
cout << "&p_nights:" << &p_nights << endl; //&p_nights:0115FAFC 指针变量*p_nights自身的地址
cout << "p_nights:" << p_nights << endl; //p_nights:01491E20 new分配给指针*p_nights的地址
cout << "*p_nights:" << *p_nights << endl; //*p_nights:1001 指针*p_nights指向的值
//使用delete释放内存
//!!!不能使用delete释放不是new分配的内存
//!!!不能使用delete释放同一个内存快两次
//!!!如果使用new[]为数组分配内存,则使用delete[]来释放
//!!!如果是要用new为实体分配内存,则应使用delete释放(没有方括号)
//!!!对空指针应用delete是安全的
delete p_nights; //删除指针*p_nights存储的地址
//使用new创建动态指针数组
double* p_p3 = new double[3]; //为指针创建一个动态数组,数组元素数量为3
p_p3[0] = 0.2;
p_p3[1] = 0.5;
p_p3[2] = 0.8;
cout << "p_p3[1] is " << p_p3[1] << endl;
p_p3 = p_p3 + 1; //指针p_p3+1后指向下一元素的地址,指针加1后,增加的量等于他指向的类型的字节数。
cout << "Now p_p3[1] is " << p_p3[1] << endl;
cout << "Now p_p3[2] is " << p_p3[1] << endl;
p_p3 = p_p3 - 1;
delete[]p_p3;
最后
以上就是追寻火为你收集整理的C++——指针的全部内容,希望文章能够帮你解决C++——指针所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复