一起来了解一下C++中的指针

目录
  • 1 指针的基本概念
  • 2 指针变量的定义和使用
  • 3 指针所占内存空间
  • 4 空指针和野指针
  • 5 const修饰指针
  • 6 指针和数组
  • 7 指针和函数
  • 8 指针、数组、函数
  • 总结

1 指针的基本概念

作用:可以通过指针间接访问内存。

内存编号是从0开始记录的,一般用十六进制数字表示。可以利用指针变量保存地址。

2 指针变量的定义和使用

指针变量定义语法:

数据类型* 变量名;
&可以取地址;*可以取地址存放的值

示例:

#include<iostream>
using namespace std;
int main()
{
	int a = 10;
	//1.指针定义的语法:数据类型 * 指针变量名;
	int* p; //int* 定义一个指向整数型的指针变量
	p = &a;
	cout << "a的地址是:" << &a << endl;
	cout << "指针p是:" << p << endl;

	//2.使用指针,可以通过解引用的方式来找到指针指向的内存
	//指针变量前加* 代表解引用,就是找到一个地址内存中存放的数据
	*p = 100;
	cout << "a = " << a << endl;
	cout << "*p = " << *p << endl;

	system("pause");
	return 0;
}

3 指针所占内存空间

指针也是种数据类型,所以指针也是占内存的

  • 32位操作空间下,占用4个字节。
  • 64位操作空间下,占用8个字节。
#include<iostream>
using namespace std;
int main()
{
	int a = 10;
	int* p = &a;

	cout << "sizeof(int*)=" << sizeof(int*) << endl;
	cout << "sizeof(float*)=" << sizeof(float*) << endl;
	cout << "sizeof(double*)=" << sizeof(double*) << endl;
	cout << "sizeof(char*)=" << sizeof(char*) << endl;
	cout << "sizeof(string*)=" << sizeof(string*) << endl;

	system("pause");
	return 0;
}

可以改变上面的x86(32位)和x64(64位),查看输出结果。

4 空指针和野指针

空指针:指针变量指向内存中编号为0的空间

用途:初始化指针变量

注意:指针变量指向的内存是不可以访问的

示例:

#include<iostream>
using namespace std;
int main()
{
	//1空指针用于给指针变量初始化.
	int* p = NULL;  //就是0

	//空指针是不可以进行访问的
	//0-255之间的内存编号是系统占用的,因此不可以访问
	*p = 100;
	//因为这里不可以访问,所以程序直接退出了,后面的代码不再执行。
	cout << p << *p << endl;

	system("pause");
	return 0;
}

野指针:指针变量指向非法的内存空间

示例:

#include<iostream>
using namespace std;
int main()
{
	//野指针
	int* p = (int*)0x1100;
	//这里定义的这个地址就是不属于我们当前地址空间的地址,就是越界了,也无法访问,所以程序会自动退出。
	cout << *p << endl;

	system("pause");
	return 0;
}

5 const修饰指针

const修饰指针有三种情况:

1.常量指针:指向常量的指针

2.指针常量:指针类型的常量

3.指向常量的指针常量:一个是本身就是常量的指针指向了一个常量。

const int* p = &a;  ---常量指针
特点:指针的指向可以修改,但是指针指向的值不可以修改。
(帮助理解:从右向左看,const在最后起固定作用,固定了*p的值,但是没有固定p的指向,即使改变了p的指向,*p也是不可更改的。)

int* const p = &a;  ---常量指针
特点:指针的指向不可以修改,但是指针指向的值可以修改。
(帮助理解:从右向左看,const在p获得地址后起固定作用,固定了p的指向,但是没有固定*p的值)

const int* const p = &a;
特点:指针的指向和指针指向的值都不可以修改。

示例:

#include<iostream>
using namespace std;
int main()
{
	int a = 10, b = 20;

	//常量指针
	const int* p = &a;
	//*p = 10;错误,指向的值不可修改
	p = &b;  //指向可以修改
	//*p = 30;即使指向改变,指向的值也是不可修改的。
	cout << *p << endl; 

	//指针常量
	int* const p2 = &a;
	//p2 = &b;错误,指向不可修改
	*p2 = 100;//指向的值可以修改
	cout << *p2 << endl;
	//指向常量的指针常量
	const int* const p3 = &a;
	//p3 = &b;错误,指向不可修改
	//*p3 = 100;错误,指向的值不可修改

	system("pause");
	return 0;
}

6 指针和数组

作用:利用指针访问数组中元素

示例:

#include<iostream>
using namespace std;
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	cout << "第一个元素为:" << arr[0] << endl;
	int* p = arr;//首地址赋予了指针变量p
	cout << p << endl;
	cout << "利用指针访问第一个元素:" << *p << endl;
	p++;//指针+1是加一存储单位,int型变量占4字节,所以+4
	cout << p << endl;
	cout << "利用指针访问第二个元素:" << *p << endl;

	char brr[2] = { 'a','b' };
	char* q = brr;
	cout << (int)q << endl;
	q++;   //字符型变量占1个字节,所以+1
	cout << (int)q << endl;

	//利用指针遍历数组
	p = arr;
	for (int i = 0; i < 10; i++)
	{
		cout << *p << endl;
		p++;
	}

	system("pause");
	return 0;
}

7 指针和函数

作用:利用指针作函数参数,可以修改实参的值。

对比值传递,值传递是为形参另开辟一段内存进行运算;

而指针传递则是传递地址,通过对地址访问,就可以直接对实参做出改变。

#include<iostream>
using namespace std;
void swap01(int a, int b) //值传递
{
	int temp = a;
	a = b;
	b = temp;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
}
void swap02(int* p1, int* p2)
{
	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}
int main()
{
	int a = 10, b = 20;
	swap01(a, b);
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	swap02(&a, &b);
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	system("pause");
	return 0;
}

8 指针、数组、函数

案例:封装一个函数,利用冒泡排序,实现对整型数组的升序排序

例如数组,int arr[10]={4,3,6,9,1,2,10,8,7,5} ;

#include<iostream>
using namespace std;
void coutarr(int* arr,int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
}
void bubbleSort(int* arr, int len) //值传递
{
	for (int i = 0; i < len; i++)
	{
		for (int j = 0; j + i < len - 1; j++)
		{
			if (arr[j] > arr[j+1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}
int main()
{
	int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };
	int len = sizeof(arr) / sizeof(arr[0]);
	cout << "排序前的数组为:" << endl;
	coutarr(arr, len);
	bubbleSort(arr, len);
	cout << "排序后的数组为:" << endl;
	coutarr(arr, len);
	system("pause");
	return 0;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • 深入了解c++数组与指针

    1.数组 数组大小(元素个数)一般在编译时决定,也有少部分编译器可以运行时动态决定数组大小,比如icpc(Intel C++编译器). 1.1数组名的意义 数组名的本质是一个文字常量,代表数组第一个元素的地址和数组的首地址.数组名本身不是一个变量,不可以寻址,且不允许为数组名赋值.假设定义数组: int A[10]; 那么再定义一个引用: int* &r=A; 这是错误的写法,因为变量A是一个文字常量,不可寻址.如果要建立数组A的引用,应该这样定义: int* const &r=A; 此时

  • 带你了解C++this指针的用法及其深究

    目录 前言 一.this指针是个什么东东,重要吗? 二.案例理解 主要的用途 总结 前言 今天,码神像一个新车手一样,尝试着用模板来更新一下,不要建议哦,毕竟没有放弃爱情的拓海也不是真正的车神,哈哈,发车了 一.this指针是个什么东东,重要吗? 首先,我以码神的名义起誓,this指针绝对重要,尤其是对于c++这个面向对象编程的语言来说! 有的码手可能要说了:你说重要就重要?那我还说不重要呢? 这个么,空口无凭,我现在来举一个例子: 我们知道对于一个类来说,要有很多工作要做,其中类的成员函数可以

  • C++ 智能指针的魅力你都了解吗

    前情提要 我们知道除了静态内存和栈内存外,每个程序还有一个内存池,这部分内存被称为自由空间或者堆.程序用堆来存储动态分配的对象即那些在程序运行时分配的对象,当动态对象不再使用时,我们的代码必须显式的销毁它们. 在C++中,动态内存的管理是用一对运算符完成的:new和delete,ne:在动态内存中为对象分配一块空间并返回一个指向该对象的指针,delete指向一个动态独享的指针,销毁对象,并释放与之关联的内存. 动态内存管理经常会出现两种问题:一种是忘记释放内存,会造成内存泄漏:一种是尚有指针引用

  • 一篇文章带你了解C++智能指针详解

    目录 为什么要有智能指针? 智能指针的使用及原理 RALL shared_ptr的使用注意事项 创建 多个 shared_ptr 不能拥有同一个对象 shared_ptr 的销毁 shared_ptr 的线程安全问题 shared_ptr 的循环引用 unique_ptr的使用 unique_ptr 总结 为什么要有智能指针? 因为普通的指针存在以下几个问题: 资源泄露 野指针 未初始化 多个指针指向同一块内存,某个指针将内存释放,别的指针不知道 异常安全问题 如果在 malloc和free 或

  • Swift中的指针操作和使用详细介绍

    Apple期望在Swift中指针能够尽量减少登场几率,因此在Swift中指针被映射为了一个泛型类型,并且还比较抽象.这在一定程度上造成了在Swift中指针使用的困难,特别是对那些并不熟悉指针,也没有多少指针操作经验的开发者(包括我自己也是)来说,在Swift中使用指针确实是一个挑战.在这篇文章里,我希望能从最基本的使用开始,总结一下在Swift中使用指针的一些常见方式和场景.这篇文章假定你至少知道指针是什么,如果对指针本身的概念不太清楚的话,可以先看看这篇五分钟C指针教程(或者它的中文版本),应

  • Go语言中的指针运算实例分析

    本文实例分析了Go语言中的指针运算方法.分享给大家供大家参考.具体分析如下: Go语言的语法上是不支持指针运算的,所有指针都在可控的一个范围内使用,没有C语言的*void然后随意转换指针类型这样的东西.最近在思考Go如何操作共享内存,共享内存就需要把指针转成不同类型或者对指针进行运算再获取数据. 这里对Go语言内置的unsafe模块做了一个实验,发现通过unsafe模块,Go语言一样可以做指针运算,只是比C的方式繁琐一些,但是理解上是一样的. 下面是实验代码: 复制代码 代码如下: packag

  • C语言中函数指针的三种使用方法总结

     C语言中函数指针的三种使用方法总结 在这里分享一下自己的心得,希望和大家一起分享技术,如果有什么不足,还请大家指正.写出这篇目的,就是希望大家一起成长,我也相信技术之间没有高低,只有互补,只有分享,才能使彼此更加成长. 定义方式:int (*p)(int x, int y); 实现代码: #include <stdio.h> int sum(int x, int y){ return x + y; } int reduce(int x, int y){ return x - y; } int

  • Swift中的指针操作详解

    前言 Objective-C和C语言经常需要使用到指针.Swift中的数据类型由于良好的设计,使其可以和基于指针的C语言API无缝混用.但是语法上有很大的差别. 默认情况下,Swift 是内存安全的,这意味着它禁止我们直接操作内存,并且确保所有的变量在使用前都已经被正确地初始化了.但是,Swift 也提供了我们使用指针直接操作内存的方法,直接操作内存是很危险的行为,很容易就出现错误,因此官方将直接操作内存称为 "unsafe 特性". 一旦我们开始直接操作内存,一切就得靠我们自己了,因

  • 浅谈c/c++中使用指针需要注意的问题

    一.使用指针的时候需要注意几点: • 分配空间 • 初始化 • 释放 二.常见的错误有几种: 1)内存分配未成功,却使用了它 编程新手常犯这种错误,因为他们没有意识到内存分配会不成功.常用解决办法是,使用内存之前检查指针是否为Null. 如果指针p是函数的参数,那么在函数的入口处用assert(p != NULL)进行检查.如果使用malloc或new来申请内存,应该用if(p == NULL)或if(p != NULL)进行放错处理. 2)内存分配虽然成功,但是尚未初始化就引用它 犯这种错误主

  • C++中函数指针详解及代码分享

    函数指针 函数存放在内存的代码区域内,它们同样有地址.如果我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,如同数组的名字就是数组的起始地址. 1.函数指针的定义方式:data_types (*func_pointer)( data_types arg1, data_types arg2, ...,data_types argn); c语言函数指针的定义形式:返回类型 (*函数指针名称)(参数类型,参数类型,参数类型,-); c++函数指针的定义形式:返回类型 (类名

  • C++中this指针的用法及介绍

    this指针只能在一个类的成员函数中调用,它表示当前对象的地址.下面是一个例子:   复制代码 代码如下: void Date::setMonth( int mn )     {      month = mn; // 这三句是等价的      this->month = mn;      (*this).month = mn;     } 1. this只能在成员函数中使用.全局函数,静态函数都不能使用this.实际上,成员函数默认第一个参数为T* const register this.如:

  • C语言中二级指针的实例详解

    C语言中二级指针的实例详解 用图说明 示例代码: #include <stdio.h> int main(int argc, const char * argv[]) { // int a = 5; int *p1 = &a; //-打印地址-----地址相同--------------- printf("&a = %p\n", &a);// printf("p1 = %p\n", p1);// int **p2 = &p

  • 探寻JavaScript中this指针指向

    探寻JavaScript中this指针指向 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然网上大部分的文章都是这样说的,虽然在很多情况下那样去理解不会出什么问题,但是实际上那样理解是不准确的,所以在你理解this的时候会有种琢磨不透的感觉),那么接下来我会深入的探讨这个问题. 为什么要学习this?如果你学过函数式编程,面向对象编程,那你肯定知

  • C++中this指针用法详解及实例

    C++中this指针用法详解及实例 概要: 本文简单介绍this指针的基本概念,并通过一个实际例子介绍this指针用于防止变量命名冲突和用于类中层叠式调用的两个用法. this指针概览 C++中,每个类 对应了一个对象,每个对象指向自己所在内存地址的方式即为使用this指针.在类中,this指针作为一个变量通过编译器隐式传递给非暂存(non-static)成员函数.因为this指针不是对象本身,因此sizeof函数并不能用于确定this指针所对应的对象大小.this指针的具体类型与具体对象的类型

随机推荐