[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;   //将数组首地址赋值  指针变量pfor (i=0; i < sizeof(arr) / sizeof(arr[0]); i++){printf("%d ",*p);   //输出 指针变量 p中的值p++;    //p 的位置 一字节一字节的 往后移. 1 到 2 到 3.....}}输出结果:
1 2 3 4 5sizeof(arr) / sizeof(arr[0])  // 表示数组长度

        2.指针-指针

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

                

#include<stdio.h>
main()
{int arr[] = { 1,2,3,4,5 };int i;int* p1 = &arr;   	//将数组首地址赋值  指针变量pint* 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;   //赋值为0printf("%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.hqwc.cn/news/448997.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Shopee越南本土店好做吗?越南本土Shopee店家如何收款?站斧浏览器

Shopee越南本土店好做吗&#xff1f; 对于越南本土的Shopee店家来说&#xff0c;他们可能会关心Shopee平台的运营情况和是否适合他们开展电商业务。那么&#xff0c;Shopee好做吗&#xff1f;以下是一些相关的讨论点。 用户基础和市场规模 作为东南亚地区最大的电商平台之一…

WPA3,WPA2,WPA的核心要点

目录 WPA是什么&#xff1f; WPA&#xff1a;WiFi protected Access 安全是什么&#xff1f; 安全 认证加密 IEEE 802.11定义了2个阶段&#xff1a;pre-RSNA&#xff0c; RSNA Pre-RSNA&#xff1a; RSNA&#xff1a;robust security network association RSNA Authent…

记录关于node接收上传文件formData踩的坑

1.vue2使用插件formidable实现接收文件&#xff0c;首先接口不可以使用任何中间件&#xff0c;否则form.parse()方法不执行。 const express require(express) const multipart require(connect-multiparty); const testController require(../controller/testController)/…

webpack源码分析——truncateArgs函数

一、truncateArgs 函数 函数功能 该函数可以用于用户界面中的文本截断&#xff0c;确保长文本在有限的显示空间内能够适当显示&#xff0c;并且用户可以了解到部分文本已被省略。 函数参数 args&#xff1a;参数数组。用于输出到界面上maxLength&#xff1a;当前界面上可容纳…

幻兽帕鲁服务器多少钱?Palworld服务器配置价格

腾讯云幻兽帕鲁服务器价格32元起&#xff0c;4核16G12M配置32元1个月、96元3个月、156元6个月、312元一年&#xff0c;支持4-8个玩家&#xff1b;8核32G22M幻兽帕鲁服务器115元1个月、345元3个月&#xff0c;支持10到20人在线开黑。腾讯云百科txybk.com分享更多4核8G12M、16核6…

Pycharm python用matplotlib 3D绘图显示空白解决办法

问题原因&#xff1a; matplotlib版本升级之后显示代码变了&#xff0c;修改为新的 # ax Axes3D(fig) # 原代码 ax fig.add_axes(Axes3D(fig)) # 新代码import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d import Ax…

ubantu扩容解决 sudo -i 报无法识别

GParted给ubuntu系统磁盘resize大小时候出现cannot resize read-only file system解决办法_gparted无法调整分区大小-CSDN博客https://blog.csdn.net/ningmengzhihe/article/details/127295333?spm1001.2014.3001.5506 解决磁盘挂载系统目录出现问题&#xff1a; 1、sudo -i…

2024年美国大学生数学建模竞赛(C题)探寻网球中的“动量”奥秘|DQN算法和Monte Carlo模拟建模解析,小鹿学长带队指引全代码文章与思路

我是小鹿学长&#xff0c;就读于上海交通大学&#xff0c;截至目前已经帮200人完成了建模与思路的构建的处理了&#xff5e; 探寻网球比赛中的“动量”奥秘&#xff01;鹿鹿学长独辟蹊径&#xff0c;运用强化学习与时间序列分析相结合&#xff0c;以DQN和Monte Carlo模拟实现对…

2024美赛ABCDEF题成品参考论文+配套数据代码+参考文献

社区抗灾能力综合评估与决策模型研究&#xff08;其余题目都在文末&#xff09; 摘要&#xff1a;社区抗灾能力的提升对于灾害风险管理至关重要。本研究基于机器学 习方法&#xff0c;构建了社区抗灾能力预测模型&#xff0c;以评估社区在灾害事件中的表现。首先&#xff0c; 我…

【前端web入门第三天】02 CSS字体和文本

文章目录: 1.字体 1.1 字体大小 1.2 字体粗细 1.3 字体样式 1.4 行高 1.5 字体族 1.6 font 复合属性 2. 文本 2.1 文本缩进2.2 文本对齐方式2.3 文本修饰线2.4 color文字颜色 1.字体 1.1 字体大小 属性名: font-size属性值:文字尺寸&#xff0c;PC端网页最常用的单位px …

ffmpeg 时间裁剪之-ss -t与滤镜中trim=start=*:duration=*的区别和联系

背景 工作中遇到的呗。记下来贡着。 滤镜重置时间戳&#xff1a;setptsPTS-STARTPTS 在FFmpeg中&#xff0c;setptsPTS-STARTPTS是一种用于调整视频时间戳&#xff08;PTS&#xff09;的滤镜表达式。这个表达式通常用于视频编辑和处理过程中&#xff0c;用于修改视频的时间轴…

聊聊DoIP吧(一)

DoIP是啥? DoIP代表"Diagnostic over Internet Protocol",即互联网诊断协议。它是一种用于在车辆诊断中进行通信的网络协议。DoIP的目标是在现代汽车中实现高效的诊断和通信。通过使用互联网协议(IP)作为通信基础,DoIP使得诊断信息能够通过网络进行传输,从而提…