C语言_指针初阶(进阶还在更新中)

news2024/11/20 7:13:34

指针是什么

  1. 指针是内存中一个最小单元的编号,也就是地址
  2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
  3. 指针就是地址,口语中说的指针通常指的是指针变量。
  4. 我们可以通过&(取地址操作符)取出变量的内存起始地址,把地址可以存放到一个变量中,这个变量就是指针变量
  5. 指针的大小在32位平台是4个字节,在64位平台是8个字节

int a = 100;
int * pa = &a; //pa是指针变量,*表示pa是指针变量,int表示pa指向的类型是int

指针和指针类型

指针类型的意义?  

  1.  int* 的指针解引用访问4个字节,char* 的指针解引用访问1个字节                                                             结论:指针类型可以决定指针解引用的时候访问多少个字节(指针的权限)
    int a = 100;
    int * pa = &a; //pa是指针变量,
    //*表示pa是指针变量,
    //int表示 1.pa指向的类型是int,2.pa解引用的时候访问的对象大小是sizeof(int)
  2. 指针类型决定指针 +1(-1) 操作时的步长,整型指针+1跳过4个字节,字符指针+1跳过1个字节

野指针 

  1. 概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
  2. 野指针成因:指针未初始化,指针越界访问,指针指向的空间释放
    //指针未初始化
    int *p;//局部变量指针未初始化,默认为随机值
    *p = 20;
    
    //指针越界访问
     int arr[10] = {0};
     int *p = arr;
     int i = 0;
     for(i=0; i<=11; i++)
     {
         //当指针指向的范围超出数组arr的范围时,p就是野指针
         *(p++) = i;
     }

  3. 如何规避野指针?
    1.指针初始化:明确知道指针应该初始化为谁的地址就直接初始化,不知道指针初始化为什么值就初始化为NULL
    
    2.小心指针越界
    
    3.指针指向的空间释放后,及时置NULL
    
    4.避免返回局部变量的地址
    
    5.指针使用前检查有效性


指针运算

  1. 指针 +- 整数
    int arr[10] = {0};
    int* p = &arr[0];
    int sz = sizeof arr / sizeof arr[0];
    
    for(int i=0; i<sz; i++)
    {
        *p = i;
        p++;
    }
    
    p = arr;
    for(int i=0; i<sz; i++) { printf("&d ", *(p+i)); }
    
    //*(p+i) == arr[i]
    //*(arr+i) == arr[i] == *(i+arr) == i[arr]
  2.  指针 - 指针
    int arr[10] = {0};
    printf("%d\n", &arr[9] - &arr[0]); //9
    //指针 - 指针的绝对值是指针和指针之间的元素个数
    //指针和指针相减的前提是两个指针指向了同一块空间

  3.  指针的关系运算
    地址是有大小的,指针的关系运算就是比较指针的大小
    
    标准规定:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,
    但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。

指针和数组

  1. 指针
    口语指针其实是指针变量,不是数组,指针变量大小是4/8字节,专门用来存放地址
  2. 数组
    数组就是数组,不是指针,数组是一块连续的空间,可以存放1个或多个类型相同的数据
  3.  指针和数组的联系
    数组中,数组名是数组首元素地址,数组名==地址==指针
    因为数组是连续存放的,所以通过指针就可以遍历访问整个数组


二级指针

  1. 指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?
    int a = 10;
    int* p = &a; //p是一级指针变量,是变量就有地址
    int** pp = &p; //pp是二级指针变量,用来存放一级指针变量的地址


指针数组

  1. 整型数组 - 存放整型的数组
    字符数组 - 存放字符的数组
    指针数组 - 存放指针(地址)的数组
  2. 模拟二维数组                                                                   

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

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

相关文章

EasyBoss ERP移动端上线数据分析模块,随时查Shopee/TikTok本土店数据

前段时间&#xff0c;EasyBoss ERP出了个超酷炫的数字大屏功能&#xff0c;广受好评。 但是也有老板说&#xff0c;电脑端看数据不够方便啊&#xff0c;你们EasyBoss有本事上个手机就能看数据的功能啊&#xff01; 说干就干&#xff0c;直接满足你们的需求&#xff01; 于是在…

推荐一款Win11主题WPF UI框架

最近在微软商店&#xff0c;官方上架了新款Win11风格的WPF版UI框架【WPF Gallery Preview 1.0.0.0】,这款应用引入了前沿的Fluent Design UI设计&#xff0c;为用户带来全新的视觉体验。 WPF Gallery简介 做为一关注前沿资讯的开发人员&#xff0c;首先关注的是应用WPF Gallery…

Centos7 安装老版本的chrome

查看自己linux是哪个centos版本 使用以下命令&#xff1a; cat /etc/centos-release我这里是centOS 7。然后在安装最新版的google-chrome时&#xff0c;总是会报错显示存在依赖环境的问题&#xff0c;使得无法安装成功chrome。 Package: google-chrome-stable (/google-chro…

HttpServer内存马

HttpServer内存马 基础知识 一些基础的方法和类 HttpServer&#xff1a;HttpServer主要是通过带参的create方法来创建&#xff0c;第一个参数InetSocketAddress表示绑定的ip地址和端口号。第二个参数为int类型&#xff0c;表示允许排队的最大TCP连接数&#xff0c;如果该值小…

无线传感器网络(物联网通信技术)期末考试2024年真题

目录 WSN期末复习资料 第一章&#xff1a;概述 第二章MAC协议 第三章路由协议 第四章时间同步技术 第五章定位技术 第六章安全技术 第七章拓扑控制 补充TPSN、HRTS公式推导 2024年期末考试考点 一、简述 二、考试真题回忆 WSN期末复习资料 第一章&#xff1a;概述 …

JVM的五大内存区域

JVM的五大内存区域 JVM内存区域最粗略的划分可以分为 堆 和 栈 &#xff0c;当然&#xff0c;按照虚拟机规范&#xff0c;可以划分为以下几个区域&#xff1a; JVM内存分为线程独享区和线程共享区&#xff0c; 其中 方法区 和 堆 是线程共享区&#xff0c; 虚拟机栈, 本地方法…

使用香橙派AIpro做目标检测

使用香橙派AIpro做目标检测 文章目录 使用香橙派AIpro做目标检测香橙派AIpro开发板介绍香橙派AIpro应用体验识别图像识别视频摄像头 香橙派AIpro AI应用场景总结 香橙派AIpro开发板介绍 ​ OrangePi AIpro(8-12T)是一款集成昇腾AI技术的开发板&#xff0c;搭载4核64位CPU和AI处…

Windows安装Visual Studio Code(VS Code) (配图超详细!)

一、下载 官方网站&#xff1a;https://code.visualstudio.com/download 二、安装 1、安装之前先在目的安装路径中新建文件夹存放待会要安装的程序&#xff08;因为在安装过程中选择安装路径时无法现场新建文件夹&#xff09;。 2、在下载目录中找到安装包并双击运行&#xf…

Java经典面试题将一个字符串数组进行分组输出,每组中的字符串都由相同的字符组成

Java经典面试题将一个字符串数组进行分组输出&#xff0c;每组中的字符串都由相同的字符组成 题目&#xff1a; 将一个字符串数组进行分组输出&#xff0c;每组中的字符串都由相同的字符组成 举个例子&#xff1a;输入[“eat”,“tea”,“tan”,“ate”,“nat”,“bat”] 输出…

实现各平台确定性的物理碰撞

1.使用FixedUpdate而不是Update 1.物理运算&#xff0c;比如刚体运动系统的运算是通过固定的时间来驱动的。 2.再moba帧同步游戏中&#xff0c;15帧的固定调用差不多是网络那边的极限了&#xff0c;采用其他手段如平滑显示来提高画面的平滑度。 FixedUpdate是以一个固定的帧率…

2009-2024年第一季度上市公司华证ESG评级季度数据

2009-2024年第一季度上市公司华证ESG评级季度数据 1、时间&#xff1a;2009-2024年第一季度 2、指标&#xff1a;证券代码、证券简称、评级日期、综合评级、综合得分、E评级、E得分、S评级、S得分、G评级、G得分、证监会行业&#xff08;新&#xff09;、同花顺行业&#xff…

步进电机(STM32+28BYJ-48)

一、简介 步进电动机&#xff08;stepping motor&#xff09;把电脉冲信号变换成角位移以控制转子转动的执行机构。在自动控制装置中作为执行器。每输入一个脉冲信号&#xff0c;步进电动机前进一步&#xff0c;故又称脉冲电动机。步进电动机多用于数字式计算机的外部设备&…

二分法查找有序表的通用算法(可查链表,数组,字符串...等等)

find_binary函数 注意事项&#xff1a; &#xff08;1&#xff09;你设计的迭代器模板中必须有using value_type T&#xff0c;且有加减运算功能&#xff0c;其本上能与C标准库std中一样。 &#xff08;2&#xff09;集合必须是有序的。 下面是函数代码&#xff1a; /// &…

flask的进阶使用方法

【 一 】一对多关系 # 1 一对一 [本质就是一对多--》多的那个唯一] # 2 一对多 # 3 多对多1.1 关系 #### 一对多关系 class Hobby(Base):__tablename__ hobbyid Column(Integer, primary_keyTrue)caption Column(String(50), default篮球)def __str__(self):return sel…

C++ | Leetcode C++题解之第213题打家劫舍II

题目&#xff1a; 题解&#xff1a; class Solution { public:int robRange(vector<int>& nums, int start, int end) {int first nums[start], second max(nums[start], nums[start 1]);for (int i start 2; i < end; i) {int temp second;second max(fi…

django学习入门系列之第四点《案例 博客案例》

文章目录 container面板案例 博客案例往期回顾 container 堆叠到两边 <div class"container-fluid clearfix"><div class"col-sm-9">1</div><div class"col-sm-3">2</div> </div>放在中间 <div clas…

嵌入式Linux系统编程 — 6.7 实时信号

目录 1 什么是实时信号 2 sigqueue函数 3 sigpending()函数 1 什么是实时信号 等待信号集只是一个掩码&#xff0c;它并不追踪信号的发生次数。这意味着&#xff0c;如果相同的信号在被阻塞的状态下多次产生&#xff0c;它只会在信号集中被记录一次&#xff0c;并且在信号集…

【Python实战因果推断】20_线性回归的不合理效果10

目录 Neutral Controls Noise Inducing Control Feature Selection: A Bias-Variance Trade-Off Neutral Controls 现在&#xff0c;您可能已经对回归如何调整混杂变量有了一定的了解。如果您想知道干预 T 对 Y 的影响&#xff0c;同时调整混杂变量 X&#xff0c;您所要做的…

项目基础知识

1.JDBC编程和MySQL数据库 数据库的连接&#xff08;以前写qq项目时的代码&#xff09; package com.wu.Util; import java.sql.*; public class JDBCUtil {private static JDBCUtil jdbcUtil null;private JDBCUtil() {}public static JDBCUtil getJdbcUtil() {if (jdbcUtil…

RUP开发模型-系统架构师(二十三)

1、RUP是一个二维软件开发模型&#xff0c;其核心特点之一是&#xff08;&#xff09;。RUP将软件开发周期划分多个循环&#xff0c;每个循环由4个连续阶段组成&#xff0c;每个阶段完成确定的任务。设计及确定系统的体系结构&#xff0c;制定工作计划及资源要求在&#xff08;…