[C语言] 指针详解(1)

一. 指针

利用指针,可以找到相对应内存地址(唯一的一段编号),从而定位数据.

(通俗来说,指针就是变量,用来存放内存单元的地址)

保存一段 16进制的 地址编号 

二、指针类型/变量:

  1. 类型:    基础类型+*           如: int*   char*
  2. 指针变量:  int*  pa           pa就为指针变量.
  3. 解引用符号:   *             放在变量前面 表示这一个变量数据 , 简单的 指针变量仅仅表示一段地址.
  4. 取地址符号:  &              取出所对应的内存单元的地址  

一般存储地址方法:

	int a = 123;
	int* pa=&a;  //将a的地址 赋值 给指针变量pa
	*pa = 20;    //将pa解引用 重新赋值

1. 一个内存单元多大?        

        一字节

2. 一个指针变量大小:

        32位平台 为 4字节   ,  64位平台 为8字节

3. 为什么指针变量一样大,为什么不同的指针类型呢?(指针类型意义)

        2个16进制位=    8个2进制位=   1字节

  意义1 : (指针类型决定了指针进行解引用操作时,能访问的空间大小)

比如:

当同时分别往2个不同类型的 指针变量存入 一个 0x11223344,然后再解引用.

解引用修改变量数据时,  int *是修改4字节, 但是char*修改1字节,  double*  修改8字节

(所以当赋值时,应该赋值合适的指针类型)

#include<stdio.h>
main()
{
	int a = 0x11223344;
	int* pa=&a;  //将a 的地址取出,放入 pa指针中
	char* pc=&a;

	printf("%p\n", *pa);  //取出指针变量 pa中的值
	printf("%p", *pc);

}

输出结果:
0000000011223344
0000000000000044

意义2 : 指针类型决定了:指针一步走多远(指针的步长)

#include<stdio.h>
main()
{
	int a = 0x11223344;
	int* pa=&a;  //将a 的地址取出,放入 pa指针中
	char* pc=&a;

	printf("%p\n", *pa);  //取出指针变量 pa中的值
	printf("%p", *pc);

}

计算结果:
000000B515CFF898
000000B515CFF895

计算 地址+1: 

  • *p= 11223344; (16进制)
  •  int*p+1      是在原先地址上+4   :127
  •  char*p+1    是在原先地址上+1   :124
  • double*p+1   是在原先地址上+8  :12b

三、野指针:
 

1.含义:

 指针指向的位置是不可知的(可能是随机的,不正确的,不明确的)

2. 造成野指针的原因:

        1).指针未初始化(局部变量不置初值,默认是随机值)

        2).指针越界

                  比如 一个数组大小为12,但是循环时指到了地址 13, 就会报错.

        3).指针指向空间释放

                当指针垮函数使用时, 由于子函数可能创建的是一个 临时变量,当子函数返回指针时,临                     时变量也将取消,当主函数再次使用值时,发现是一个释放掉的空区域.

3.避免野指针:

        1).指针未初始化

        2).指针越界

        3).指针合适赋值为 nill, 空指针无法被访问

        4).使用前检查有效性

四、指针运算

        1.指针+-整数

                 p+1  表示      地址位置根据 数据类型 往后面移位置

                *p+1 表示      p中存储的数据+1

#include<stdio.h>
main()
{
	int arr[] = { 1,2,3,4,5 };
	int i;
	int* p = arr;   //将数组首地址赋值  指针变量p
	for (i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		printf("%d ",*p);   //输出 指针变量 p中的值
		p++;    //p 的位置 一字节一字节的 往后移. 1 到 2 到 3.....
	}

}

输出结果:
1 2 3 4 5

sizeof(arr) / sizeof(arr[0])  // 表示数组长度

        2.指针-指针

                指针-指针,  表示 两指针中间的元素个数.(必须保证是同一空间,同一类型)

                

#include<stdio.h>
main()
{
	int arr[] = { 1,2,3,4,5 };
	int i;
	int* p1 = &arr;   	//将数组首地址赋值  指针变量p
	int* p2 = &arr[2];

	printf("%d ", p2-p1);

}

结果为 2

        3.指针关系运算

            注:  标准规定,允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针作比较,但不允许和第一个元素之前的内存位置的指针作比较

允许p2 和p3

不允许p2 和p1

        虽然在绝大部分情况下可以运行成功

#include<stdio.h>
main()
{
	int arr[5] = { 1,2,3,4,5 };
	int i;
   int *p2;

	for (p2=&arr[5]; p2>&arr[0];)  //将最末端小于或等于最前段时 ,停止
	{
		*--p2 = 0;   //赋值为0
		printf("%d ", *p2);
	}
}
结果:0 0 0 0 0

    

五、指针与数组

1.首地址代表 :

        数组名   

         &数组名[0]

2.不代表首地址情况:

        &数组名                   表示整个数组,取出整个数组地址

        sizeof(数组名)          表示整个数组,计算整个数组的大小

 六、二级指针    

int main()
{
    int a=10;
    int* aa=&a;      //一级指针  类型  int*   ,存的变量的地址
    int** aaa=&aa;   //二级指针  类型  int**  ,存的指针的地址
    **aaa=20;        //修改了a的值为20
}

七、指针数组/数组指针

        指针数组:存放指针的数组

        数组指针:指针

int main()
{
    int a=1;
    int b=2;
    int c=3;

    int* arr[3]={&a,&b,&c};  //存储3个地址,称为指针数组

    int i=0;
    for(i=0;i<3;i++)
    {
    printf("%d",*(arr[i]));  //循环打印出 abc中的值
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/372595.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

广度优先求有向图-图中点的层次-BFS宽搜

代码如下&#xff1a; #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N 1e5 10; int e[N], ne[N], h[N], idx; int d[N], q[N]; //d用来存储每个位置到1号点的距离&#xff0c;q用来做模拟队列将符合条件的结…

CAN总线接口–硬件

8.3 CAN总线接口–硬件 虽然CAN总线目前已应用于工业控制、机器人、医疗器械等领域&#xff0c;汽车控制领域是CAN总线的最大市场。保守地估算&#xff0c;按每辆车30个CAN网络节点&#xff0c;2019年全球汽车产量约9100万辆&#xff0c; 即27.3亿个CAN网络节点。在汽车领域&am…

13.rk3588搭建rknn环境

一、搭建Anaconda3环境 首先下载Anaconda3-2022.10-Linux-aarch64.sh&#xff0c;链接&#xff1a;https://pan.baidu.com/s/10oXSAaleAEoe6KaJ3IQyaw &#xff0c;提取码&#xff1a;mtag 。 下载后放入到自己的home文件夹下面&#xff0c;然后在该文件夹下运行 bash Anaco…

34 使用 LNMP 架构部署动态网站环境

源码包程序 LNMP 动态网站部署架构 LNMP 动态网站部署架构是一套由 Linux Nginx MySQL PHP 组成的动态网站系统 解决方案。 1. 准备工作 在使用源码包安装服务程序之前&#xff0c;首先要让安装主机具备编译程序源码的环境。这需要 具备 C 语言、C语言、Perl 语言的编译器&…

Python:流程控制

4.1 顺序结构 在任何编程语言中最常见的程序结构就是顺序结构。顺序结构就是程序从上到下一行行地执行&#xff0c;中间没有任何判断和跳转。 如果Python程序的多行代码之间没有任何流程控制&#xff0c;则程序总是从上往下依次执行&#xff0c;排在前面的代码先执行&#xf…

Failed at the chromedriver@2.27.2 install script.

目录 【错误描述】Failed at the chromedriver2.27.2 install script. npm install报的错误 【解决方法】 删除node_modules文件夹npm install chromedriver --chromedriver_cdnurlhttp://cdn.npm.taobao.org/dist/chromedrivernpm install 【未解决】 下载该zip包运行这个&…

RK3568驱动指南|驱动基础进阶篇-进阶7 向系统中添加一个系统调用

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

Matplotlib 绘图实践:从基础到高级技巧【第62篇—python:Matplotlib绘图】

文章目录 Matplotlib绘图模块基础入门大全1. 安装Matplotlib2. 绘制基本图形3. 自定义图形样式4. 多子图布局5. 高级绘图技巧6. 绘制实时动态图7. 图形注释与标记8. 颜色映射与散点图9. 绘制直方图10. 绘制饼图11. 绘制热力图 总结 Matplotlib绘图模块基础入门大全 Matplotlib…

字符串哈希模版(来自TsReaper)

有一个字符串word,让你求出某一段所对应的数值&#xff08;即映射值&#xff09;&#xff0c;word[L,R]对应的数值。

【LeetCode: 239. 滑动窗口最大值 + 滑动窗口 + 单调队列】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

rhel8静态ip配置

1.先cd进来 2.把默认的dhcp改成static IPADDR192.168.211.22 22随意改&#xff0c;255以下的数字都行&#xff0c;1和255不要用 GATEWAY192.168.211.2和虚拟机默认网关保持一致 重启网络 nmcli c reload和 nmcli c up ens160 ping百度测试--&#xff08;成功了&#xff0…

dnslog在sql盲注

首先必须保证sql是在windows下 因为需要使用到UNC路径 保证mysql中的secure_file_priv为空 secure_file_priv为null&#xff0c;load_file则不能加载文件。 secure_file_priv为路径&#xff0c;可以读取路径中的文件&#xff1b; secure_file_priv为空&#xff0c;可以读取磁盘…

ShardingSphere 5.x 系列【5】Spring Boot 3 集成并实现读写分离

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 概述2. 使用限制3. 案例演示3.…

maven-install-plugin:2.4:install (default-cli) on project ability-dispatch:

IDEA&#xff0c;instal时报错 &#xff0c;错误 信息如下&#xff1a; Failed to execute goal org.apache.maven.plugins:maven-install-plugin:2.4:install (default-cli) on project ability-dispatch: The packaging for this project did not assign a file to the buil…

javaEE - 24( 20000 字 Servlet 入门 -2 )

一&#xff1a; Servlet API 详解 1.1 HttpServletResponse Servlet 中的 doXXX 方法的目的就是根据请求计算得到相应, 然后把响应的数据设置到HttpServletResponse 对象中. 然后 Tomcat 就会把这个 HttpServletResponse 对象按照 HTTP 协议的格式, 转成一个字符串, 并通过S…

golang并发安全-sync.Once

什么是sync.Once sync.Once 是 Go 语言中的一种同步原语&#xff0c;用于确保某个操作或函数在并发环境下只被执行一次。它只有一个导出的方法&#xff0c;即 Do&#xff0c;该方法接收一个函数参数。在 Do 方法被调用后&#xff0c;该函数将被执行&#xff0c;而且只会执行一…

情人节浪漫礼物指南:精选共享甜蜜时光的情人节礼物推荐

情人节&#xff0c;代表着浪漫和爱意的纪念日&#xff0c;总能激起每个人内心深处的悸动&#xff0c;促使他们渴望与爱侣共度美好时刻。为爱人精心选择一份情人节礼物&#xff0c;不仅是对他们深情的告白&#xff0c;更是将这份爱升华&#xff0c;让它成为两人爱情故事里的宝贵…

C# Winform NLog的使用笔记

一、NLog的介绍 NLog是一个开源的、灵活的、可扩展的日志记录库&#xff0c;用于.NET平台。它提供了强大的日志记录功能&#xff0c;可以帮助开发人员在应用程序中实现高效的日志记录和跟踪。它提供了一种简单且灵活的方式来在应用程序中记录日志信息。NLog支持多种日志目标&am…

计算机设计大赛 深度学习+opencv+python实现昆虫识别 -图像识别 昆虫识别

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数&#xff1a;2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 4 MobileNetV2网络5 损失函数softmax 交叉熵5.1 softmax函数5.2 交叉熵损失函数 6 优化器SGD7 学…

一次Kubernetes Pod内存异常导致的测试环境耗时异常问题排查过程

概述 在使用公司内部后台系统测试环境时发现一个请求加载慢的问题&#xff0c;简简单单的列表&#xff0c;查询MongoDB数据库&#xff0c;测试环境不过几百上千条数据而已&#xff0c;请求耗时居然高达5~6秒&#xff1a; 作为对比&#xff0c;生产环境的请求响应截图如下&…