广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C/C++指针介绍与使用详解
  • 2032
分享到

C/C++指针介绍与使用详解

C++指针的概念C语言指针用法 2022-11-13 15:11:31 2032人浏览 薄情痞子
摘要

目录什么是指针定义指针变量间接引用指针常or常常指向指针的指针指针与数组指针的运算堆内存分配C语言c++语言指针与函数数组名作为函数的入口参数函数名作为参数传入其他函数使用指针修改函

什么是指针

C/C++语言拥有在程序运行时获得变量的地址和操作地址的能力,这种用来操作地址的特殊类型变量被称作指针。

翻译翻译什么tmd叫tmd指针!

变量或常量的指针存储的数据是 :对应的变量或常量在内存中的地址。

图解:

此时 我们定义三个指针 p1, p2, p3 分别指向a, b, c ,那么p1中存储的数据是变量a所占用内存的首地址:0x00;

b和c中存储的数据是什么呢? 没错,就是0x02和0x04。

显然。若要知道变量a的值,首先读取指针p1中的数据0x00,然后读取内存0x00和0x01中的数据就可以了。这个时候,会出现一个问题:怎么才能确定究竟要读取几个单位内存中的数据呢?毕竟p1中只存储了0x00呀。这个时候 ,指针的类型就发挥了作用。举个例子:如果定义的指针是int类型的,那么读取的时候自动从指针中存储的初值向后读取4个字节;float类型的指针就是读取8个字节。这样就可以既完整又不多余的取出所需要的数据了。

总结一下一个指针的两个要素:指针类型和指针所指变量的初地址。

定义指针变量

指针在定义的时候最好直接初始化,否则可能出现意想不到的结果。

@定义一个指向变量的指针。


int a = 3;
int * p;	
p = &a;	//把a的地址赋值给p;

p = &28;	//这也是可以的,p指向的地址中存储的数据是28.

*p = 28;

间接引用指针

间接引用操作符也是 *

*p 取出p指向的内存空间中的值。

所以区分定义或是引用指针可能有些麻烦。

只有同类型的指针和变量才能通过 * 和 & 互相建立关系。

int a = 0;
int temp;
int * p = &a;

cout<< *p;	//输出结果是0

*p = 3;	//把3赋值给a
a = 3;

temp = a;
temp = *p;	//temp被赋值为0

float f = 3.1;
int * p = &f;	//error,指针类型与变量类型不匹配 

常or常常

这个部分本来应该在定义指针变量里,但是因为需要指针的间接引用作为铺垫,所以把它单独拿出来了

我们先区分一组概念:常量、指向常量的指针、常指针以及指向常量的常指针。

1.常量:顾名思义不发生改变的量,想必大家是熟悉的。

2.指向常量的指针:只限制间接访问操作,不限制指针指向的值本身的操作规范。

3.常指针:指针中存储的地址一经初始化就不能改变了,也就是说常指针只能指向一个固定的地址,但是地址中存储的数据是可以改变的哦~

4.指向常量的常指针:根据上面三个概念大家应该可以理解了,就是指针中存储的地址和该地址中的数据皆不可更改。

例如:

int b = 4;
const int a = 5;	//定义一个常量a。

const int *p = &a;	//定义一个指向常量的指针p,指向常量a。
p = &b;	//这个也是没问题的哦
*p = 6;	//error,这个间接访问操作是不可以。 
int * const p2 = &b;//定义一个常指针p2
*p2 = 6;	//这个是可以的,注意区分和上面的区别
const int * const p3 = &a;	//指向常量的常指针p3

*p = 11;	//error,因为p指向的是常量,常量的值不可更改
*p2 = 2;	//true,p2是常指针,指向的地址不变,但地址中的值可以更改
*p3 = 4;	//error
p3 = &b;	//error

指向指针的指针

指针本质上也是一个变量或常量,那么指针也是有地址的,而指向这些地址的指针被称为指向指针的指针。

int a = 25;
int * p  = &a;
int pp = &p;	//true,pp指向的地址中存储的是指针p的地址。 

指针与数组

一个数组的数组名就是一个常指针。

int arr[] = {5,4,6,9,8,3};

arr就是一个指针,而且指向数组的第一个元素arr[0]。

指针数组:

char * arr[] ={"this is", "a", "C++ !"}; 

在此提及一下字符串常量:

char * a 

a = "dshfw";	

指针的运算

指针只能支持 + 和 - 的运算,但这已经足够满足大多数指针操作的需求了。


int arr[] = {5,4,6,9,8,3};
cout<< *p;	//输出结果为5
cout<< *(p+1);	//输出结果为4

for(int *p = arr; p < arr+5; ++p)
{
	cout<< *p<<' ';
}
cout<<endl;

堆内存分配

C语言


void * malloc(size_t size);


int *arr;
if(arr = (int *) malloc(5 *sizeof(int)) == NULL)
{
	exit(1);
}

free(arr);

C++语言

注意释放数组内存空间时,delete后有[] !!!


int * arr = new int[5];
delete[] arr;

int * arr = new int;
delete arr;

指针与函数

函数名和数组名一样都是一个指针,有时我们需要把函数名作为参数传入其他函数中。

数组名作为函数的入口参数

arr[] = {4,6,9,8,5,3,2,7,5};

void Sort_shell(int arr[], int n)
{

}
void Sort_Shell(int * arr, int n)
{

}

void Sort_Shell(int * arr[], int n)
{

}

举个小小的例子


void Sort_Shell(int arr[], int n)
{
	int gap = n / 2;
	for(; gap > 0; gap /= 2)
	{
		for(int i = gap; i <n; ++i)
		{
			int temp = a[i];
			int j = i;
			while(j >= gap&& temp < arr[j -  gap])
			{
				a[j] = a[j - gap];
				j -=gap;
			}
			a[j] = temp;
		}
	}
}

开了个小差,接下来回归正题,我们的指针。

函数名作为参数传入其他函数

static bool cmp(int a, int b)
{
	return a < b;
}
void show(bool * b)
{
	if( &b)
	{
		cout<< true;
	}
	else
	{
		cout<<false;
	}
}

使用指针修改函数参数

首先来看个例子:

void swip(int a, int b)
{
	int c = a;
	a = b;
	b = c;	
}
int main()
{
	int a = 5, b = 6;
	swip(a, b);
	cout<<a<<' '<<b;
}

输出结果:5 6

并未达到交换的效果,因为函数内部对形参的修改并不能反映到上层的main函数中。

此时我们可以通过指针作为函数的入口参数来实现预期的功能。

void swip(int * a, int* b)
{
	int c = *a;
	*a = *b;
	*b = c;	
}
int main()
{
	int a = 5, b = 6;
	swip(&a, &b);
	cout<<a<<' '<<b;
}

输出结果:6 5

传递函数的指针虽然能达到预期效果,但是确实以破坏函数的黑盒为代价,可读性差,调试困难。

有没有什么更好的办法呢?接下来 引用登场了。

变量的引用作为函数的参数

void swip(int &a, int &b)
{
	int c = a;
	a = b;
	b = c;	
}
int main()
{
	int a = 5, b = 6;
	swip(a, b);
	cout<<a<<' '<<b;
}

输出结果:6 5

克服了指针作为参数的弊端。话又有点多了,哈哈,这和指针有什么关系呢······

两个常用的字符串函数

  • strcmp() :用于比较字符串的大小。
  • strcpy() :复制字符串。
//函数原型
int strcmp(const char * arr1, const char * arr2);
//使用举例:
char arr1[] = "dfetf";
char arr2[] = "cfefef";
int b = strcmp(arr1, arr2);

输出b的值是大于0 的。

总结

指针强大而又危险,却也是C和C++的灵魂,由于其可以直接操作内存地址的特殊性,使得理解指针是如何工作的在C和C++中必不可少,若想成为一名优秀的C++工作者,必须要掌握指针。

到此这篇关于C/C++指针介绍与使用详解的文章就介绍到这了,更多相关C++指针内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C/C++指针介绍与使用详解

本文链接: https://www.lsjlt.com/news/166128.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C/C++指针介绍与使用详解
    目录什么是指针定义指针变量间接引用指针常or常常指向指针的指针指针与数组指针的运算堆内存分配C语言C++语言指针与函数数组名作为函数的入口参数函数名作为参数传入其他函数使用指针修改函...
    99+
    2022-11-13
    C++指针的概念 C语言指针用法
  • C语言指针详细介绍
    本篇内容主要讲解“C语言指针详细介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言指针详细介绍”吧!指针对于C来说太重要。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机...
    99+
    2023-06-15
  • C++中指针的详解及其作用介绍
    目录概述指向对象的指针指向对象数据成员的指针this 指针this 指针的作用this 指针的实现概述 指针 (pointer) 是一个变量, 其指为另一个变量的地址. 即内存位置的...
    99+
    2022-11-12
    C++指针 C++指针详解
  • C语言指针的详细介绍
    这篇文章主要介绍“C语言指针的详细介绍”,在日常操作中,相信很多人在C语言指针的详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言指针的详细介绍”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!目录...
    99+
    2023-06-20
  • C#指针的用法介绍
    这篇文章主要讲解了“C#指针的用法介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#指针的用法介绍”吧!指针在C\C++里面可是一个好东西,但是到java,.net的时代指针已经被封装起...
    99+
    2023-06-17
  • C++指针与数组:指针详解
    目录一. What(什么是指针)1. 地址初了解2. 指针概念3. 指针与指针变量二. Why(为什么要有指针)三. How(如何使用指针)1. 基本定义2. 取地址操作符 &...
    99+
    2022-11-12
    C++指针 C++数组
  • C语言简明介绍指针的使用
    目录1. 指针类型2. 野指针3. 指针的运算3.1 指针+-整数3.2指针-指针3.3 指针的关系运算4. 指针数组1. 指针类型 指针以字节为单位; 指针类型决定了解引用时能访问...
    99+
    2022-11-13
    C语言 指针函数 C语言 指针
  • C/C++指针与内存管理图文详解
    目录一.指针二.数组总结指针和内存管理始终是C/C++比较容易模糊的知识点,但在C/C++编程中又绕不开的地方,特别在下位机上,会频繁的与指针打交道,如果概念模糊,一不小心就会写出冗...
    99+
    2022-11-13
    C++指针 C++内存管理
  • C语言详解函数与指针的使用
    目录一、函数类型二、函数指针三、回调函数四、小结一、函数类型 C 语言中的函数有自己特定的类型 函数的类型由返回值,参数类型和参数个数共同决定,如 int add(int i, in...
    99+
    2022-11-13
    C语言 函数 C语言 指针
  • C指针原理教程之Ncurses介绍
    Ncurses是一个用于编写基于文本终端的图形用户界面(GUI)的库。它提供了一些函数和数据结构,可以方便地处理终端窗口、颜色、字符...
    99+
    2023-08-16
    C
  • C语言的数组指针与函数指针详解
    目录前言函数指针语法数组指针与指针数组总结前言 数组指针和函数指针都是C语言比较难的知识点,尤其是函数指针,并且函数指针在开发中有着巨大的作用。 函数指针语法 定义一个函数指针,并通...
    99+
    2022-11-13
    C语言数组指针 C语言函数指针
  • C语言指针详解之野指针
    目录指针是什么?怎么表示?什么是指针变量?指针类型又是什么?指针类型存在的意义野指针是什么?野指针产生的原因一、 指针未初始化二、 指针越界访问如何避免野指针(野狗)的出现呢?指针运...
    99+
    2022-11-12
    C语言指针 C语言野指针
  • C++指针学习详解
    目录指针的基本概念一、指针变量的定义和使用二、指针所占的空间内存1.空指针 野指针2. const修饰指针利用指针访问数组中的每个元素.总结指针的基本概念 指针的作用:可以通过指针间...
    99+
    2022-11-12
    C++指针 指针学习
  • C语言指针详解
    目录前言:复杂类型说明一、细说指针1.指针的类型2.指针所指向的类型3.指针的值----或者叫指针所指向的内存区或地址4 指针本身所占据的内存区二、指针的算术运算三、运算符&...
    99+
    2022-11-12
    C语言指针 C语言指针解析
  • C++函数指针详解
    函数指针基础: 1. 获取函数的地址 2. 声明一个函数指针 3.使用函数指针来调用函数 获取函数指针: 函...
    99+
    2022-11-12
    C++函数指针 C++指针
  • 详解C++ 指针与二维数组名
    和一维数组类似,C++ 将二维数组名解释为其第一个元素的地址,而二维数组的第一个元素为一维数组,下面详细总结下二维数组名的性质。 和一维数组类似,C++ 将二维数组名解释为其第一个元...
    99+
    2022-11-13
    C++ 指针 C++二维数组
  • C++关于指针,继承和多态介绍
    目录指针指针和继承指针、继承和多态指针 我们在书本上学到的指针基本上都是:首先,指针是一个变量;其次,这个变量存储的值是一个地址。这个是对指针的一个基本理解,最近在编程中发现了一些新...
    99+
    2022-11-12
    C++ 智能指针和继承多态 的实现
  • C++中关于this指针的入门介绍
    目录简介特性举例注意简介 C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参 数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有...
    99+
    2022-11-13
    C++ this指针 C++ this指针作用
  • C语言一看就懂的指针与结构体介绍
    目录指针结构体指针 指针是C语言或者是c++里面最让人头疼的内容之一,正所谓指针在手,可以任指天下,这里只是简单的介绍指针的一些概念,后期我们将会深入剖析指针的基本原理。 注意:一个...
    99+
    2022-11-13
    C语言指针 C语言结构体
  • C/C++中智能指针的用法详解
    目录前言一、什么是智能指针二、使用方法1.shared_ptr2.unique_ptr3.weak_ptr前言 本章主要介绍一些C/C++中智能指针的实现原理以及如何使用 一、什么是...
    99+
    2023-01-04
    C++智能指针使用 C++智能指针
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作