【C语言】让你不再害怕“指针”【知识点详解】

这篇具有很好参考价值的文章主要介绍了【C语言】让你不再害怕“指针”【知识点详解】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一.什么是指针&&为什么需要指针?

1.什么是指针?

2.为什么需要指针?

以一个代码为例观察地址:(这里我们可以通过调试和打印两种方式观察)

1.调试观察:

2.打印观察(地址是用%p 打印):

二.地址编号的来源&&指针变量的大小

产生来源

指针变量大小

三.指针类型  

1.指针都有哪些类型

2.指针类型的意义

1.指针类型决定了指针在解引用时,可以访问多少个字节(即指针的权限)

2.指针类型决定指针在加减1时的步长(即跨过多少字节)

四.野指针

1.野指针的概念:

2.野指针的成因

3. 如何规避野指针

五.指针运算

1.指针加减整数

 2.指针-指针

 3.指针的关系运算

 六.指针和数组

1.指针和数组的关系

2.通过指针遍历数组

七.二级指针


一.什么是指针&&为什么需要指针?

1.什么是指针?

指针是内存中最小内存单元编号,也就是地址

平时口语上说的指针是指指针变量,用于存放地址的变量

2.为什么需要指针?

1.首先,为了管理我们计算机内存,把内存分为很多个小的内存单元,每个内存单元是一个字节

2.为了方便使用这些内存单元,又把每个内存单元都给一个唯一的编号(下面会讲解编号怎么来的),这个编号也称为地址;在C语言中,这个地址也叫指针,所以编号==地址==指针

当我们在写c语言程序时,创建的变量数组等都会在内存中开辟空间;

以一个代码为例观察地址:(这里我们可以通过调试打印两种方式观察)

1.调试观察:

【C语言】让你不再害怕“指针”【知识点详解】

这里的操作符是 “&”----->是取地址操作符 ,是个单目操作符

&a 的作用是  把a的地址取出来

2.打印观察(地址是用%p 打印):

【C语言】让你不再害怕“指针”【知识点详解】

 在同一次的程序运行时,我们可以观察到,两种方式观察到的地址是一样的,但是如果我们再次运行时,地址就会发生变化,(如下图:)

这是因为在每次程序运行时,电脑会随机分配地址(这里也不是完全随机,也会考虑一些因素:如该地址是否被占用等因素),所以同一个代码,在每次运行时所分配的地址可能都会又差异;

【C语言】让你不再害怕“指针”【知识点详解】

 


二.地址编号的来源&&指针变量的大小

产生来源

对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电 平(低电压)就是(1或者0); 那么32根地址线产生的地址就会是:

00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000001

...

11111111 11111111 11111111 11111111

一共就有2^32个地址

如果是64位机器上就是2^64个地址

指针变量大小

在32位机器上,一个地址是32位二进制序列,即4个字节大小

在64位机器上,一个地址是64位二进制序列,即8个字节大小

注意:指针变量大小即(4 / 8个字节)只与是多少位机器有关,与变量所指向的内容无关

如:在32位机器上

int  *  p    --------->   p的大小是4个字节

char * p1   -------->   p1的大小是4个字节

short * p2  ------->   p2的大小是4个字节

代码验证:

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
int main()
{

	printf("%d\n",sizeof(int *));
	printf("%d\n", sizeof(char*));
	printf("%d\n",sizeof(short *));

	return 0;
}

结果 

【C语言】让你不再害怕“指针”【知识点详解】


三.指针类型  

1.指针都有哪些类型

                             类型(就是去掉变量名字,剩余的就是类型)

char*  p     ------>  char*

short*  p    ------>  short*

int *  p       ------>  int*

long*  p     ------>  long*

float*  p     ------>  float*

double* p  ------>  double*

等等.......

这里可以看到,指针的定义方式是: type + * 

其实: char* 类型的指针是为了存放 char 类型变量的地址;

short* 类型的指针是为了存放 short 类型变量的地址;

int* 类型的指针是为了存放 int 类型变量的地址

【C语言】让你不再害怕“指针”【知识点详解】


2.指针类型的意义

1.指针类型决定了指针在解引用时,可以访问多少个字节(即指针的权限)

讲解的代码:

【C语言】让你不再害怕“指针”【知识点详解】

 【C语言】让你不再害怕“指针”【知识点详解】

 分析:

从上面的例子我们可以看出:int * 的指针解引用可以访问4个字节

                                               char *的指针解引用可以访问1个字节

我们也可以推出: short * 的指针解引用可以访问2个字节

                              long long  * 的指针解引用可以访问8个字节

结论:

指针类型决定了指针在解引用时,可以访问多少个字节(即指针的权限)

2.指针类型决定指针在加减1时的步长(即跨过多少字节)

讲解代码:

【C语言】让你不再害怕“指针”【知识点详解】

分析:

整型指针加1,跳过4个字节;

字符指针加1,跳过1个字节; 

结论:

指针类型决定指针在加减1时的步长(即跨过多少字节)

如果是    type  *  p      加减n        ,就会跳过sizeof(type)*n 个字节

       例如  int    *  p                                               4    *   n  个字节


四.野指针

1.野指针的概念:

 概念 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

2.野指针的成因

1.指针未初始化

【C语言】让你不再害怕“指针”【知识点详解】

 2.指针越界访问

 【C语言】让你不再害怕“指针”【知识点详解】

 3. 指针指向的空间释放

【C语言】让你不再害怕“指针”【知识点详解】

 3. 如何规避野指针

 1.指针初始化

当明确知道指针放谁的地址就直接初始化谁的地址;

不知道初始化为谁的地址就暂时初始化为NULL(空指针)

2.防止指针越界;

3.当指针指向的空间释放,即使置为NULL

4.避免返回局部变量的地址

5.指针使用之前检查有效性


五.指针运算

1.指针加减整数

前面在指针类型的意义那有讲解到加减n;

示例:用指针打印数组

【C语言】让你不再害怕“指针”【知识点详解】

 2.指针-指针

指针-指针其实就是地址-地址;

指针-指针的前提是:都指向的是同一块空间

指针-指针得到的数值的绝对值(因为可能为负数)是:两指针之间的元素个数

示例:

【C语言】让你不再害怕“指针”【知识点详解】

 3.指针的关系运算

标准规定: 允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与 指向第一个元素之前的那个内存位置的指针进行比较。(如下面第二个图中代码)

图一:

【C语言】让你不再害怕“指针”【知识点详解】

 图二:

【C语言】让你不再害怕“指针”【知识点详解】


 六.指针和数组

1.指针和数组的关系

指针变量就是指针变量,不是数组,指针变量的大小是4  /  8个字节,是专门用来存放地址的;

数组就是数组,不是指针,是一块连续的空间,可以存放一个或多个相同类型的数据;

联系:

数组名是首元素地址(两种特殊情况除外,sizeof(数组名)函数(数组名),数组名是地址,数组名==地址==指针;

2.通过指针遍历数组

当我们知首元素地址时,又因为数组时连续存放的,所以通过指针就可以遍历访问数组;

【C语言】让你不再害怕“指针”【知识点详解】

 证明:

#include <stdio.h>
int main()
{
    int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
    int* p = arr; //指针存放数组首元素的地址
    int sz = sizeof(arr) / sizeof(arr[0]);
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("&arr[%d] = %p   <====> p+%d = %p\n", i, &arr[i], i, p + i);
    }
    return 0;
}

【C语言】让你不再害怕“指针”【知识点详解】

 所以 p+i 其实计算的是数组 arr 下标为i的地址;

 那我们就可以直接通过指针来访问数组;


七.二级指针

是变量就会有地址,一级指针变量也是有地址的,存放一级指针地址的变量就是二级指针

【C语言】让你不再害怕“指针”【知识点详解】

 【C语言】让你不再害怕“指针”【知识点详解】文章来源地址https://www.toymoban.com/news/detail-478533.html



到了这里,关于【C语言】让你不再害怕“指针”【知识点详解】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【详解】C语言冷门知识点之--位段

    下面是维基百科对位段的解释:   位段(或称“位域”,Bit field)为一种数据结构,可以把数据以位的形式紧凑的储存,并允许程序员对此结构的位进行操作。这种数据结构的好处: 可以使数据单元节省储存空间,当程序需要成千上万个数据单元时,这种方法就显得尤为重

    2024年02月16日
    浏览(41)
  • 一文让你深入了解JavaSE的知识点

    ꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶ 个人主页:xiaoxieʕ̯

    2024年02月04日
    浏览(43)
  • C++知识点 -- 智能指针

    对于上面的场景,p1和p2在new申请空间后,div函数如果出现了除0错误,那么程序就会抛出异常,跳到接受异常的程序段继续执行,p1和p2申请的空间就没有被正常释放,造成了内存泄漏; 这种场景我们就可以使用智能指针来解决空间的释放问题。 RAII(Resource Acquisition Is Initia

    2024年02月03日
    浏览(60)
  • [C/C++]指针详讲-让你不在害怕指针

     个人主页:北·海  🎐CSDN新晋作者  🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:C/C++ 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗 目录 前言  一.与*的作用与结合方向 二.指针和数组的关系 1.利用指针访问数组里的值 2.利

    2024年02月10日
    浏览(34)
  • 【C】指针——知识点大全(详细,简洁,含例题)

      前言: 大家好,这里是 YY ;此篇博客主要是 指针的知识点 ;包含 【一二级指针】【字符指针】【指针数组】【数组指针】【以上知识的实际应用】【函数指针】【函数指针数组】 PS:创作不易,每个知识点都有 例题或者图 帮助理解;如果对你有帮助,希望能够得到您的

    2024年02月05日
    浏览(46)
  • C语言知识点汇总

    C语言知识点保姆级总结,这不得进你的收藏夹吃灰?! 拖了很久的C语言所学知识的简单小结,内容有点多,第一次总结也可能有错误或者不全面,欢迎随时补充说明! ​ 用不同数据类型所定义的变量所占空间大小不一样,定义的变量不是保存于数据类型中,而是因为只有

    2024年01月23日
    浏览(51)
  • [知识点整理]中科院/国科大 自然语言处理nlp 期末考试知识点整理

    本文为2022秋网安学院的自然语言处理课程期末复习知识点整理,水平有限,整理的答案可能有错误或遗漏,欢迎大家指正。 文章的第二部分内容参考了学校学姐的文章,文章写的很好,大家可以关注她: (133条消息) 【一起入门NLP】中科院自然语言处理期末考试*总复习*:考

    2024年02月09日
    浏览(50)
  • 8086 汇编语言知识点梳理

    机器语言是机器指令的集合 机器指令是一台机器可以正确执行的命令 机器指令由一串二进制数表示 汇编语言的主体是汇编指令 汇编指令是机器指令便于记忆的书写格式 汇编指令是机器指令的 助记符 汇编指令:机器码的助记符,有对应的机器码 伪指令::没有对应的机器

    2024年02月08日
    浏览(53)
  • 计算机语言知识点梳理

    python是一门强类型、动态型、解释型语言语言 JavaScript是一门弱类型、动态性、解释型语言 typescript是一门强类型、静态型、编译型语言 Java是一门强类型、静态型、编译型语言 变量大小写区分 html css sql java javascript python typescript c 弱类型语言和强类型语言 强类型语言也称为强

    2024年02月09日
    浏览(48)
  • 详解MVCC相关知识点

    前言:学习前,先叙述mysql相关基础知识,一步步了解mysql底层机制。 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted 、Read committed、Repeatable read 、Serializable ,这四个级别可以逐个解决脏读 、不可重复读 、幻读 这几类问题。 √: 可能出现    ×: 不会出现

    2024年02月06日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包