服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言基础指针详解教程

C语言基础指针详解教程

2022-02-27 16:15RookieStriver C/C++

此处对于指针做一些简要的介绍,作者实属初学,写博客也是作者学习的一个过程,难免文章中有内容理解不到位或者有不当之处,还请朋友们不吝指正,希望大家给予支持

 

1.1:概述

 

1.1.1:内存

内存含义:

  • 储存器:用来存储程序和数据,辅助CPU进行运算处理的重要组成部分。
  • 内存:内部存储器,暂时存放程序/数据。
  • 外存:外部储存器,长时间保存程序/数据。

 

1.1.2:内存

内存地址:

  • 可以理解为将内存抽象成一个很大的一维数组。
  • 编码就是将内存的每一个字节分配一个32位或者64位的编号。这个内存编号我们就称为地址

 

1.1.3:指针和指针变量

  • 内存中每一个字节都有一个编号,我们称之为”地址“。
  • 指针的实质就是内存的”地址“。地址就是指针,指针也就是地址。
  • 指针是地址,而定义的指针变量是存放地址的变量。

 

1.2:指针基础知识

 

1.2.1:指针变量的定义和使用

- 指针是一种数据类型,指针变量是一种存放地址编号的变量。

-‘*" 解引用操作符,表示指针所指的内存空间的具体内容。

打印变量的地址:(用%p)

C语言基础指针详解教程

解引用操作符的运用:

C语言基础指针详解教程

int * 代表了指针类型,p是定义的指针类型的变量,将a的地址赋给变量P,这是p中存的是a的地址编号,p就指向了a的空间,*P就表示a空间里的内容,也就是a的值。

 

1.2.2:通过指针间接修改变量的值

前面我们提到了关于由const修饰的局部变量的修改,不可以通过赋值直接修改,这里我们介绍通过指针间接的修改变量的值。

C语言基础指针详解教程

当直接修改由const修饰的常量时,我们可以看出会发生错误。

C语言基础指针详解教程

这时我们定义一个指针变量间接的修改局部变量的值是可以的!我们用个图来辅助理解:

C语言基础指针详解教程

 

1.2.3:指针的大小

  • sizeof() 测得是指针变量指向的储存地址的大小。
  • 在32位平台,所有指针地址都是32位(4字节)。
  • 在64位平台,所有指针地址都是64位(8字节)。

C语言基础指针详解教程

 

1.2.4:空指针与野指针

  • 空指针(NULL):主要用于给指针变量初始化,空指针是指向内存地址编号为0的空间。int * P = NULL;
  • 野指针:对我个人理解而言,对于野指针我理解为指向一个未知的空间,(通俗来讲,就是我虽然知道这块内存的地址编号,但是我并不知道这块内存具体存放的是什么内容)。下面我介绍两野指针常见错误。

①:任意数值赋值给野指针。

②:操作野指针指向的内存区域。

C语言基础指针详解教程

 

1.2.4:万能指针

这里我们不做详细的介绍,void * 指针可以指向任意变量的内存空间:

C语言基础指针详解教程

特别注意:我们在对万能指针进行操作时,因为系统需要知道具体需要对几个字节的内容进行操作,所以我们需要强转成具体的指针类型。

1.2.5:const修饰的指针变量

const修饰指针变量时,因const的位置不同,修饰的意义也有所不同,如下代码:

C语言基础指针详解教程

对于p1 ,const可以理解为修饰的*p1,也就是修饰的空间的内容,这时这块空间的地址是可以重新赋值的,而内容不可以!

对于p2,const修饰的是指针变量p2,也就是修饰的空间地址,所以这时可以对内容进行辅助,而不可以改变变量的地址!

注:在编写程序时,指针作为函数参数传递,如果对应的内存空间的值不会被修改,可以使用const修饰指针数据类型。

 

1.3:指针与数组

 

1.3.1:数组名

敲重点:对一维数组来说,数组名是首元素地址,是一个常量!!,不可以修改,切记切记,对二维数组来说,此时数组名也是首元素地址,只不过此时的首元素不再只是一个元素,而是一个一维数组。

 

1.3.2:指针操作数组

其实博主觉得,用指针操作数组可读性还是比较差,而且后续面对多维数组,用指针来操作数组比较麻烦,可读性差。无奈博主学艺不精呀。

C语言基础指针详解教程

这里*(arr + i) 与arr[i]的效果一摸一样,这里的知识点涉及到指针的加减运算,见下一小节。

 

1.3.3:指针的加减运算

(1) 加法运算

指针计算绝对不是简单的整数相加,这里与指针类型有关:

  • 如果是一个整型指针,那么+1的效果就是变化一个int的大小。
  • 如果是一个字符型指针,那么+1的效果就是变化一个char的大小。

C语言基础指针详解教程

此时数组名是首元素1的地址,属于整型指针,+2表示变化2个int的大小,也就是第三个元素的地址。

(2) 减法运算

这里对于指针减一个整数的作用与加法如出一辙,也是与指针类型有关。

C语言基础指针详解教程

这里我们利用一个逆序打印数组来说明指针减法,特别注意 arr与&arr分别+1的区别,arr表示的是首元素地址,&arr表示的是整个数组的地址,arr + 1变化4字节,而&arr + 1 变化的是整个数组大小的字节数(36)。如图:

C语言基础指针详解教程

C语言基础指针详解教程

我们可以看出,打印&arr与arr的地址编号是一样的,但是意义是不一样的。 1.3.4:指针数组

指针数组还是一个数组,数组元素都是指针类型,拿一级指针数组举例:

C语言基础指针详解教程

这里博主提一点自己对一级指针数组的理解,希望对大家有一丢丢帮助,一级指针数组我把它与二级指针、二维数组相对应,这里不做详细解释,后续指针强化我会解释我的理解,这种理解可能按官方说法来说不严谨,但是能帮助我们理解就好。

 

1.4:指针基础小结

  • int i:定义整型变量
  • int * p:定义一个指向int的指针变量
  • int **p:定义一个二级指针,指向一级指针。
  • int arr[10]:定义一个有10个整型元素的数组。
  • int *arr[10]:定义一个有10个一级指针元素的数组。

 

1.5:总结

OK!!!观众老爷们,这里只是介绍了指针的入门知识,如果朋友们觉得有一点点作用的话,希望朋友们能够给予小菜鸟一点支持!后续继续给朋友们带来更好的博文,还希望朋友们能够继续关注,小菜鸟致力于把自己的学习经验与个人理解更多的分享给大家,望大家喜欢与指正,希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_43727529/article/details/120805159

延伸 · 阅读

精彩推荐
  • C/C++深入理解goto语句的替代实现方式分析

    深入理解goto语句的替代实现方式分析

    本篇文章是对goto语句的替代实现方式进行了详细的分析介绍,需要的朋友参考下...

    C语言教程网7342020-12-03
  • C/C++学习C++编程的必备软件

    学习C++编程的必备软件

    本文给大家分享的是作者在学习使用C++进行编程的时候所用到的一些常用的软件,这里推荐给大家...

    谢恩铭10102021-05-08
  • C/C++C语言中炫酷的文件操作实例详解

    C语言中炫酷的文件操作实例详解

    内存中的数据都是暂时的,当程序结束时,它们都将丢失,为了永久性的保存大量的数据,C语言提供了对文件的操作,这篇文章主要给大家介绍了关于C语言中文件...

    针眼_6702022-01-24
  • C/C++C语言实现电脑关机程序

    C语言实现电脑关机程序

    这篇文章主要为大家详细介绍了C语言实现电脑关机程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    xiaocaidayong8482021-08-20
  • C/C++详解c语言中的 strcpy和strncpy字符串函数使用

    详解c语言中的 strcpy和strncpy字符串函数使用

    strcpy 和strcnpy函数是字符串复制函数。接下来通过本文给大家介绍c语言中的strcpy和strncpy字符串函数使用,感兴趣的朋友跟随小编要求看看吧...

    spring-go5642021-07-02
  • C/C++C++之重载 重定义与重写用法详解

    C++之重载 重定义与重写用法详解

    这篇文章主要介绍了C++之重载 重定义与重写用法详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    青山的青6062022-01-04
  • C/C++C/C++经典实例之模拟计算器示例代码

    C/C++经典实例之模拟计算器示例代码

    最近在看到的一个需求,本以为比较简单,但花了不少时间,所以下面这篇文章主要给大家介绍了关于C/C++经典实例之模拟计算器的相关资料,文中通过示...

    jia150610152021-06-07
  • C/C++c++ 单线程实现同时监听多个端口

    c++ 单线程实现同时监听多个端口

    这篇文章主要介绍了c++ 单线程实现同时监听多个端口的方法,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下...

    源之缘11542021-10-27