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

news2024/10/7 12:22:26

一. 指针

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

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

保存一段 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.coloradmin.cn/o/1434260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.5学习总结

2.5 1.传纸条 2.装箱问题 3.开心的金明 4.传球游戏 5.修改数组 6.对局匹配 7.刷题统计 传纸条https://www.luogu.com.cn/problem/P1006 题目描述 小渊和小轩是好朋友也是同班同学&#xff0c;他们在一起总有谈不完的话题。一次素质拓展活动中&#xff0c;班上同学安排坐成一…

【已解决】青龙面板依赖安装失败原因

青龙面板必须安装依赖&#xff0c;才可以执行脚本&#xff0c;这是不争的事实。 如果脚本跑不起来&#xff0c;就去看看依赖吧。 NodeJs 依赖如下 axios request canvas cheerio js-base64 dotenv magic tough-cookie ws7.4.3 require requests date-fns ts-md5 typescript j…

Office恢复旧UI|Office UI问题|Word UI|小喇叭找不到

Office恢复旧UI&#xff5c;Office UI问题&#xff5c;Word UI&#xff5c;小喇叭找不到 问题描述&#xff1a;Office新版本默认新UI&#xff0c;主界面没有小喇叭可以切换到旧UI. 解决方案&#xff1a; 以下述内容新建.txt&#xff0c;保存并改后缀为.reg&#xff0c;双击打开…

从领域外到领域内:LLM在Text-to-SQL任务中的演进之路

导语 本文介绍了ODIS框架&#xff0c;这是一种新颖的Text-to-SQL方法&#xff0c;它结合了领域外示例和合成生成的领域内示例&#xff0c;以提升大型语言模型在In-context Learning中的性能。 标题&#xff1a;Selective Demonstrations for Cross-domain Text-to-SQL会议&am…

Qt设计师中(没有现成的控件):如何添加QToolBar工具栏

1、在QtCreator设计师界面中,在MainWindow上右键,有“添加工具栏”菜单项 2、但只有在MainWindow上右键才有&#xff0c;在其它控件上方点击则没有&#xff0c;那么怎么在对话框上添加呢&#xff1f; 可以添加一个QWidget&#xff0c;然后手动在ui文件里把class改为QToolBar就…

ONLYOFFICE 桌面编辑器8.0上新!六大更新内容等你来用!

各位铁铁&#xff0c;相信你们对ONLYOFFICE都不陌生了&#xff0c;那么今天咱们具体来看看ONLYOFFICE桌面编辑器8.0的上的六大新内容吧~ 更新一&#xff1a;可填写的PDF表单 8.0版本中最引人瞩目的改进之一&#xff0c;是具备创建高度复杂的PDF表单的能力&#xff0c;并允许用…

CSS的Day05(浮动+flex布局)

跟着黑马程序员的课&#xff0c;稍稍对CSS的了解 常见的显示模式&#xff1a;行内、块级、行内块 在HTML中&#xff0c;标准流也称为文档流或普通流&#xff0c;是指元素按照其在HTML文档中的出现顺序依次排列的方式。在标准流中&#xff0c;元素会自动占据父容器的空间&#…

什么是TCP三次握手、四次挥手?

&#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是小徐&#x1f947;☁️博客首页&#xff1a;CSDN主页小徐的博客&#x1f304;每日一句&#xff1a;好学而不勤非真好学者 &#x1f4dc; 欢迎大家关注&#xff01; ❤️ 1、三次握手 你(客户端)给一个朋友(服务器)打电…

前端面试题-网络部分-http和其他协议之间的区别-ajax请求的步骤-XSS,CSRF-http的加密过程- 浏览器缓存

前端面试题-网络部分-http和其他协议之间的区别-ajax请求的步骤-XSS,CSRF-如果ajax请求-http的加密过程 http和其他协议之间的区别http和tcp之间的区别http和websocket协议有什么区别 Ajax请求的步骤什么是XSS&#xff0c;CSRF攻击https加密的过程浏览器缓存 http和其他协议之间…

BUGKU-WEB Simple_SSTI_1

02 Simple_SSTI_1 题目描述 没啥好说的~ 解题思路 进入场景后&#xff0c;显示&#xff1a; You need pass in a parameter named flag。ctrlu 查看源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><titl…

函数对象(仿函数)的相关基本概念及用法

函数对象&#xff08;仿函数&#xff09; 基本概念 重载函数调用操作符的类&#xff0c;其对象称为函数对象 函数对象使用重载的&#xff08;&#xff09;时&#xff0c;行为类似函数调用&#xff0c;因此也被称为仿函数 本质 函数对象&#xff08;仿函数&#xff09;是一…

机器学习本科课程 大作业 多元时间序列预测

1. 问题描述 1.1 阐述问题 对某电力部门的二氧化碳排放量进行回归预测&#xff0c;有如下要求 数据时间跨度从1973年1月到2021年12月&#xff0c;按月份记录。数据集包括“煤电”&#xff0c;“天然气”&#xff0c;“馏分燃料”等共9个指标的数据&#xff08;其中早期的部分…

yarn/npm certificate has expired

目录 报错 原因&#xff1a;HTTPS 证书验证失败 方法 a.检查网络安全软件&#xff1a;可能会拦截或修改 HTTPS 流量 b.strict-ssl:false关闭验证【临时方法】 报错 info No lockfile found. [1/4] Resolving packages... error Error: certificate has expired at TLS…

【华三】GRE VPN 实验配置

【华三】GRE VPN 实验配置 前言报文格式实验需求配置思路配置拓扑GRE配置步骤R1基础配置GRE 配置ISP_R2基础配置R3基础配置GRE 配置PCPC1PC2抓包检查OSPF建立GRE隧道建立配置文档前言 VPN :(Virtual Private Network),即“虚拟专用网络”。 它是一种通过公用网络(通常是互…

骨传导耳机是什么原理?适合什么场景使用?

骨传导耳机是一种非常特殊的蓝牙耳机&#xff0c;它们通过骨传导技术将声音直接传送到内耳。这种技术不同于传统耳机&#xff0c;它不通过空气传送声音&#xff0c;而是通过头骨的振动来传送声音。 骨传导耳机的传声原理跟传统耳机有所不同&#xff0c;传统耳机通过空气振动将…

爱上算法:每日算法(24-2月2号)

&#x1f31f;坚持每日刷算法&#xff0c;将其变为习惯&#x1f91b; 题目链接&#xff1a;101. 对称二叉树 最开始肯定是比较简单的想法&#xff0c;就是遍历左右节点呀&#xff0c;不相等我就直接返回false。 但是这样错了&#xff0c;我们要的是以根节点为轴&#xff0c;而…

使用 Python、Elasticsearch 和 Kibana 分析波士顿凯尔特人队

作者&#xff1a;来自 Jessica Garson 大约一年前&#xff0c;我经历了一段压力很大的时期&#xff0c;最后参加了一场篮球比赛。 在整个过程中&#xff0c;我可以以一种我以前无法做到的方式断开连接并找到焦点。 我加入的第一支球队是波士顿凯尔特人队。 波士顿凯尔特人队是…

【Linux】文件周边002之初步理解文件管理(打开的文件)

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.&#xff08;打开…

PMP资料怎么学?PMP备考经验分享

PMP考试前大家大多都是提前备考个一两个月&#xff0c;但是有些朋友喜欢“不走寻常路”&#xff0c;并不打算去考PMP认证&#xff0c;想要单纯了解PMP&#xff0c;不管要不要考证&#xff0c;即使是仅仅学习了解一下我个人都非常支持&#xff0c;因为专业的基础的确能提高工作效…

【Linux系统 02】Shell脚本

目录 一、Shell概述 二、输入输出 三、分支控制 1. 表达式 2. if 分支 3. case 分支 四、循环控制 1. for 循环 2. while 循环 3. select 循环 五、函数 一、Shell概述 Shell是Linux系统连接用户和操作系统的外壳程序&#xff0c;将用户的输入和请求选择性传递给操…