指针基本认识

article/2025/10/21 17:52:18

指针

  • 一、指针是什么?
  • 二、指针和指针类型
    • 1.指针+-整数
    • 2.指针的解引用
  • 三、野指针
  • 四、指针运算
    • 1.指针-指针
    • 2.指针关系运算
  • 五、指针和数组
  • 六、二级指针
  • 七、指针数组


一、指针是什么?

  在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。

内存:
在这里插入图片描述

总结:指针就是变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。

这里有个问题:

  一个小的单元到底是多大?(1个字节)如何编址?

  经过仔细的计算和权衡我们发现一个字节给一个对应的地址是比较合适的。

  对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的是产生一个电信号正电/负电(1或 者0).

  每个地址标识一个字节,那我们就可以给 (2^32Byte == 2^32/1024KB ==232/1024/1024MB==232/1024/1024/1024GB == 4GB) 4G的空闲进行编址。

这里就明白:

  在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节。

  那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。

总结:

  指针是用来存放地址的,地址是唯一标示一块地址空间的。

  指针的大小在32位平台是4个字节,在64位平台是8个字节。

二、指针和指针类型

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

  这里可以看到,指针的定义方式是: type + 。其实: char* 类型的指针是为了存放 char 类型变量的地址。 short* 类型的指针是为了存放 short 类型变量的地址。 int* 类型的指针是为了存放int 类型变量的地址。

1.指针±整数

对指针±代表+或-类型的大小。

#include <stdio.h>
//演示实例
int main()
{int n = 10;char *pc = (char*)&n;int *pi = &n;printf("%p\n", &n);printf("%p\n", pc);printf("%p\n", pc+1);printf("%p\n", pi);printf("%p\n", pi+1);return  0; }

总结:指针的类型决定了指针向前或者向后走一步有多大(距离)。

2.指针的解引用

对指针解引用代表指针能访问sizeof(type)个字节。

int main()
{int n = 0x11223344;char *pc = (char *)&n;int *pi = &n;*pc = 0;   //重点在调试的过程中观察内存的变化。*pi = 0;   //重点在调试的过程中观察内存的变化。return 0;}

总结: 指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。 比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。

三、野指针

野指针: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
成因:
1.指针未初始化

#include <stdio.h>
int main()
{ int *p;//局部变量指针未初始化,默认为随机值*p = 20;return 0; }

2.指针越界访问

#include <stdio.h>
int main()
{int arr[10] = {0};int *p = arr;int i = 0;for(i=0; i<=11; i++){//当指针指向的范围超出数组arr的范围时,p就是野指针*(p++) = i;}return 0}

3.指针指向的空间释放

四、指针运算

1.指针-指针

  两个指针相减代表指针之间所经历元素个数。(元素:有参与计算的指针说了算)。

int my_strlen(char *s) 
{char *p = s;while(*p != '\0' )p++;return p-s; 
}

2.指针关系运算

//1.
#define N_VALUES 5
float values[N_VALUES];
float *vp;
//指针+-整数;指针的关系运算
for (vp = &values[0]; vp < &values[N_VALUES];)
{*vp++ = 0; }
//2.
for(vp = &values[N_VALUES]; vp > &values[0];)
{*--vp = 0; }
//3.
for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--) {*vp = 0; }

  实际在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这样写,因为标准并不保证它可行。

标准规定:
  允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。
  所以,第3份代码不推荐。

五、指针和数组

  指针和数组没有任何关系。但是指针和数组的用法非常类似,可以相互转化。
  其中有一点是在数组传参时数组降维成指针,很可能是为了减少计算次数,提高计算机的效率。由此以来,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]);for(i=0; i<sz; i++){printf("&arr[%d] = %p   <====> p+%d = %p\n", i, &arr[i], i, p+i);}return 0; }

运行结果:
在这里插入图片描述

所以 p+i 其实计算的是数组 arr 下标为i的地址。
那我们就可以直接通过指针来访问数组。

六、二级指针

指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里? 这就是 二级指针 。
在这里插入图片描述

对于二级指针的运算有:

  *ppa 通过对ppa中的地址进行解引用,这样找到的是 pa , *ppa 其实访问的就是pa。

int b = 20; *ppa = &b;//等价于 pa = &b;

**ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引用操作: *pa ,那找到的是 a。

**ppa = 30;
//等价于*pa = 30;
//等价于a = 30;

七、指针数组

指针数组是存放指针的数组。

int arr1[5];
char arr2[6];

在这里插入图片描述

int* arr3[5];//是什么?

arr3是一个数组,有五个元素,每个元素是一个整型指针。
在这里插入图片描述


http://chatgpt.dhexx.cn/article/8X11dr9e.shtml

相关文章

c++ 指针详解

文章目录 指针1、 使用指针遍历[数组](https://blog.csdn.net/m0_62870588/article/details/123787052)2、指针的概念与理解3、指针的创建与初始化4、指针的基本操作5、指针的算数操作6、[const](https://blog.csdn.net/m0_62870588/article/details/123399735)指针7、指针的[数…

深入理解C语言指针

一、指针的概念 要知道指针的概念&#xff0c;要先了解变量在内存中如何存储的。在存储时&#xff0c;内存被分为一块一块的。每一块都有一个特有的编号。而这个编号可以暂时理解为指针&#xff0c;就像酒店的门牌号一样。 1.1、变量和地址 先写一段简单的代码&#xff1a; …

c语言指针的指针

1、情况 c语言指针的指针&#xff0c;还是比较常用的一个功能&#xff1b;当然&#xff0c;我也相信&#xff0c;一些用C语言很长时间的人&#xff0c;也没大用过&#xff0c;因为用不到&#xff0c;这是工作需求决定的&#xff0c;但总体来说&#xff0c;还是经常用的。 理解…

十四、C指针详解(四):指针的指针

文章目录 一、指针的指针 一、指针的指针 指针用来存放变量的地址&#xff0c;同时&#xff0c;指针也有自己的地址&#xff0c;因此&#xff0c;就可以设置一个指针变量&#xff0c;用来存放指针的地址&#xff0c;也就是指针的指针&#xff0c;他存放的是一个地址&#xff0…

指针的指针、字符串和指针、数组指针(详)

一、指针的指针 指针的指针&#xff0c;即指针的地址 定义了一个指针变量&#xff0c;指针变量本身占4个字节&#xff0c;指针变量也有地址编号 例&#xff1a; int a0x12345678; 假设a的地址为&#xff1a;0x0000 2000 int *p; p&a; 则p中存放的是a的地址编号为0x0000 20…

指针的指针(简单易懂)

int a 12&#xff1b; int *b &a; 内存的分配如下 这时再来一个变量 c &b; 问题来了? c 是什么类型? b 是指向整型的指针 ,c 是指向整形指针的指针&#xff1f; 是的 c 是指向指针的指针 声明如下 int ** c; int a 12; int *b &a; int **c &b…

Nginx Rewrite规则详解

Nginx Rewrite 规则相关指令 相关指令有if,rewrite,set,return,break等&#xff0c;其中最关键的就是rewrite.一个简单的Nginx Rewrite规则语法如下&#xff1a;rewrite ^/b/(.*)\.html /play.php?video$1 break; 1.break指令 默认值&#xff1a;none ;使用环境&#xff1a…

nginx配置文件rewrite规则

nginx配置文件rewrite规则 文章目录 nginx配置文件rewrite规则[toc]ifRewite 规则介绍flag标志位配置rewrite规则last二次转发 if 语法&#xff1a;if (condition) {…} 应用场景&#xff1a; server段 location段 常见的condition 变量名&#xff08;变量值为空串&#xf…

nginx Rewrite 规则

一&#xff1a;nginx Rewrite 规则 1&#xff1a;rewrite的概念&#xff1a; Nginx Rewrite功能是使用nginx提供的全局变量或自己设置的变量&#xff0c;结合正则表达式和标志位实现URL重写以及重定向功能。Rewrite指令只能放在server {}&#xff0c;location {}&#xff0c;…

Nginx高级之Rewrite规则

进阶阶段的回顾: Nginx进阶之静态Web资源服务 Nginx进阶之代理服务 Nginx进阶之负载均衡服务 Nginx进阶之缓存服务和动静分离 作用及应用场景 作用: 实现对URL的重写以及对匹配(正则表达式)的url的重定向 场景: 1. URL访问跳转, 支持开发设计 ① 页面跳转 ② 兼容…

Nginx配置请求转发location及rewrite规则

location / {# 精确匹配 / &#xff0c;主机名后面不能带任何字符串[ configuration A ] }location / {# 因为所有的地址都以 / 开头&#xff0c;所以这条规则将匹配到所有请求# 但是正则和最长字符串会优先匹配[ configuration B ] }location /documents/ {# 匹配任何以 …

Rewrite规则简介

Rewirte主要的功能就是实现URL的跳转&#xff0c;它的正则表达式是基于Perl语言。可基于服务器级的(httpd.conf)和目录级的(.htaccess)两种方式。如果要想用到rewrite模块&#xff0c;必须先安装或加载rewrite模块。方法有两种一种是编译apache的时候就直接安装rewrite模块&…

rewrite详解

rewrite模块 URI跟URL介绍 什么是uri&#xff1f;统一标识符&#xff0c;拿www.abc.com/aw/wd/举例&#xff0c;那么rui就是/aw/wd/这部分数据(也有可能是图片&#xff0c;html网页,如果是伪静态的话,那就得看配置是啥玩意了 什么是url? 统一定位符&#xff…

Nginx基础——Rewrite规则

点击上方“芋道源码”&#xff0c;选择“置顶公众号” 技术文章第一时间送达&#xff01; 源码精品专栏 精尽 Dubbo 原理与源码专栏( 已经完成 69 篇&#xff0c;预计总共 75 篇 )中文详细注释的开源项目Java 并发源码合集RocketMQ 源码合集Sharding-JDBC 源码解析合集Spring …

F280049C Crossbar X-BAR

文章目录 X-BAR9.1 输入X-BAR9.2 ePWM、CLB和GPIO输出X-BAR9.2.1 ePWM X-BAR9.2.1.1 ePWM X-BAR架构 9.2.2 CLB X-BAR9.2.2.1 CLB X-BAR架构 9.2.3 GPIO输出X-BAR9.2.3.1 GPIO输出X-BAR架构9.2.4 X-BAR标志 总结 X-BAR 交叉开关&#xff08;在本章中称为X-BAR&#xff09;提供…

BCGControlBar Pro 31.2 正式版-Key

什么是 MFC 的 BCGControlBar Pro&#xff1f; BCGControlBar&#xff08;“Business Components Gallery ControlBar”&#xff09;是一个 MFC 扩展库&#xff0c;企鹅180846090允许您创建具有完全自定义选项&#xff08;功能区、可自定义工具栏、菜单等&#xff09;和一组丰富…

BCGControlBar Library for .NET 7.1.1 Crack

什么是 BCGControlBar Library for .NET&#xff1f; BCGControlBar Library for .NET 是 100% 托管代码工具包&#xff0c;用 C/CLI 编写&#xff0c;面向 Microsoft .NET Framework 2.0 或更高版本。该库包含许多高度可定制、完全可设计的组件&#xff0c;使您能够创建最复杂…

BCGControlBar v12的向导使用图解

BCGControlBar专业版是MFC的一个扩展库&#xff0c;您可以用来构建类似于Microsoft Office 2000/XP/2003/2007/2010、Microsoft Visual Studio&#xff08;打印、用户定制工具栏、菜单等&#xff09;和其他一些知名产品的高级用户界面。 首先从网上下载BCGControlBar v12资源 &…

MFC界面控件BCGControlBar v33.4 - 日历、属性网格组件升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版和BCGSuite for MFC v33.4已正式发布了&#xff0c;该版本包含了对Windows 11 Mica materi…

BCG学习(一)——BCGControlBar安装与配置

最近工作中需要用到BCG相关的知识&#xff0c;趁着全民防疫、居家隔离这段时间正好学习一下&#xff0c;作此笔记&#xff0c;记录学习过程和心得体会。话不多说&#xff0c;开整&#xff01; 简介 下载、安装与配置 例程编译与运行 简介 BCG是MFC的一个扩展库&#xff0c;可以…