[C语言]初步的来了解一下指针(多图详解)

news/2024/12/26 18:07:41/

       

目录

       

        1.指针是什么

        2.指针类型

        2.1指针类型的意义(+-整数)

        2.2指针的解引用

        3.野指针

        3.1野指针出现的情况

             3.2 如何规避野指针

        4.指针运算

                4.1指针+-整数

                 4.2指针-(减)指针

        5.二级指针       


        1.指针是什么

                指针是内存中最小的单元编号,也就是地址。指针还可以是一种指针变量

                内存:

                当我们平时在创造一个变量后,内存会开辟出相应的空间来存放这一数据,例如在创建一个float变量并赋值后,开辟了四个字节来存放,每一个字节都有相应的地址来对应

                 指针变量:
                我们可以通过&(取地址操作符)取出变量的内存其实地址,把地址可以存放到一个变量中,这个变量就是指针变量

         2.指针类型

                像整型和浮点型都有不同的类型,int,short,float等等,相应的指针也有着不同的类型         

        如下: 

(在定义指针的时候要将其初始化,但如果没有可以指向的变量,一般用NULL空指针表示)

char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;

                对于指针的定义可以看出来为:类型 + *

                不同类型的指针来存放不同类型类型变量的地址

                char*类型的指针存放char类型变量的地址

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

                以此类推……

        2.1指针类型的意义(+-整数)

                指针类型的不同除了代之存放变量类型,还可以根据不同类型的字节的不同来进行操作

                举例说明:

                int类型为‘4’字节数

                char类型为‘1’字节数

int main()
{int a = 10;int* pa = &a;char* pc = &a;printf("a=%d\n\n", a);printf("pa=%p\n", pa);printf("pa+1=%p\n\n", pa + 1);printf("pc=%p\n", pc);printf("pc+1=%p\n", pc + 1);return 0;
}

                打印结果:

                对此,我们可以发现:

         同样是+1为什么差别这么大呢?原因就正是在指针类型的不同上,不同字节的指针类型+1所得到的地址是:原地址 + 整数*(sizeof(指针类型))

        char*类型一次访问1个字节,+1跳过1个字节

        int*类型一次访问4个字节,+1跳过4个字节

        可能有人有疑问说:

        Q:为什么int类型的变量的地址可以放到char*类型中呢?

        A:指针变量都是用来存放地址的,类型的不同只是使得他们的意义不同。

        总结:指针的类型决定了指针向前或者向后走一步有多大(距离),这一点在下面解引用也有所体现。


        2.2指针的解引用

                解引用通俗的来说,就是根据地址去寻找所存储的内容

                *pa = a

                但在指针变量的声明或定义中并不是解引用,只是创建一个 (int*)类型的指针变量

                 对于不同的指针类型,对指针解引用的权限也是不同的,这一点跟指针类型的意义中整数的+-有所类似

                 对比两个例子可以看出,char*类型指针只具有一个字节,所以在解引用后只有一个字节的权限,再次赋值时也只能改变一个字节。如果使用char*类型指针想要将a赋值为0,则要循环语句逐一的将四个字节都赋值为0

                而int*类型指针具有四个字节,在解引用后具有四个字节的权限,所以在赋值时可以一次将四个字节都赋值为0。

                char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节

                 在对机器大小端的判别时,就运用到了这个知识点。具体举例在以下文章:

                [C语言]和我一起来认识“整型在内存中的存储”_HY_PIGIE的博客-CSDN博客

 3.野指针

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

        3.1野指针出现的情况

1.指针未初始化

int* p;
*p = 20;

2.指针越界访问

int arr[10] = {0};
int *p = arr;
for(int i = 0;i <= 10;i++)
{*(p++) = i;//当i=10时超出数组的范围,p就为野指针
}

             3.2 如何规避野指针


                1. 指针初始化
                2. 小心指针越界
                3. 指针指向空间释放,及时置NULL
                4. 避免返回局部变量的地址
                5. 指针使用之前检查有效性

        4.指针运算

                4.1指针+-整数

int arr[9] = {0};
int* pa = null;
for(pa = &arr[0];pa < &arr[9])
{*pa++ = 0;
}

             

                数组为int类型,取得首元素的地址也即为数组的地址。

                获取地址的指针类型为int*(四字节),*运算符的优先级高于++的优先级

                所以先是*pa = 1,赋值后再

                *pa++,地址+1

                因为是int*类型,+1等价于加上四个字节即一个整数位,所以相当跳过一个数组单位

                得出:当i++变化时,pa = arr。有:

                pa+i =arr[i]; 

                 4.2指针-(减)指针

    char arr[] = "abcdef";char* pa = arr;    //数组首元素的地址while (*pa != '\0'){pa++;当没有遇到字符串结尾的‘\0’,就++}int len = pa - arr;//两个指针相减,得到++的差值,便是字符串的长度printf("%d", len);

        5.二级指针       

        指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?这就是 二级指针

        像ppa这种取指针地址的指针称为二级指针。
          5.1二级指针的运算

        

                 本文章目前就到此为止了,如有不对的地方欢迎留言指正。

                谢谢观看

                


http://www.ppmy.cn/news/10117.html

相关文章

【Linux】make/Makefile的使用

本文目录 背景简介 使用方法 为什么执行的指令是make和make clean呢&#xff1f; gcc如何判断文件是否需要重新执行&#xff1f; 背景简介 一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefifile定义了一系列的规则来指定…

学习笔记6:字符串库函数(下)

目录 一. strstr模拟实现 二. strtok模拟实现 三.关于strerror和perror的说明 一. strstr模拟实现 库函数strstr函数首部&#xff1a;char * strstr ( const char *str1, const char * str2); 函数的功能是在str1指向的主字符串中寻找子串str2&#xff0c;并且返回主字符串中…

【经典面试题】

TC经典面试题1.赛马问题 WY经典面试题2.:烧香问题 砝码称重问题 有36匹马&#xff0c;6个跑道&#xff0c;在没有计时器的情况下&#xff0c;至少需要赛马多少次&#xff0c;才能比出前三名&#xff1f; 答案&#xff1a;至少需要比较8次。 解题思路&#xff1a; 先把36匹…

2023年中职网络安全竞赛Windows操作系统渗透测试解析(超详细)

B-12:Windows操作系统渗透测试 任务环境说明: 服务器场景:Server2305(关闭链接)服务器场景操作系统:Windows(版本不详)通过本地PC中渗透测试平台Kali对服务器场景进行系统服务及版本扫描渗透测试,并将该操作显示结果中445端口对应的服务版本信息字符串作为Flag值提交…

c++入门(命名空间+缺省参数+函数重载)

文章目录1. 命名空间1. c语言的两个域2. 命名空间的使用1.类型问题命名空间A和B的实现2. 变量问题3.三种访问方法1.指定命名空间访问2. 全局展开using namespace std 的含义尽量不使用using namespace std的原因3. 部分展开2. 缺省参数(备胎)1. 概念2.全缺省参数3.半缺省参数错…

【07】概率图推断之信念传播

概率图推断之信念传播 文章目录将变量消除视为信息传递信息传递算法加总乘积信息传递因子树上的加总乘积信息传递最大乘积信息传递总结在《概率图推断之变量消除算法》中&#xff0c;我们讲了变量消除算法如何对有向图和无向图求P(Y∣Ee)P(Y \mid E e)P(Y∣Ee)的边缘概率。 …

IDEA启动项目通过https进行访问,nginx配置https访问

一、IDEA启动项目通过https进行访问 1、获取证书 证书申请网络有很多方法&#xff0c;这里腾讯云的nginx版证书举列 2、证书转换 springboot是识别p12证书的&#xff0c;所有这里需要吧pem证书进行转换。转换工具OpenSSL-Win64&#xff08;自行百度下载&#xff09;下载完…

一步步实现React-Hooks核心原理

React Hooks已经推出一段时间&#xff0c;大家应该比较熟悉&#xff0c;或者多多少少在项目中用过。写这篇文章简单分析一下Hooks的原理&#xff0c;并带大家实现一个简易版的Hooks。 这篇写的比较细&#xff0c;相关的知识点都会解释&#xff0c;给大家刷新一下记忆。 Hooks…