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

news/2024/7/8 12:06:48 标签: c语言, 开发语言

指针是什么

  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.niftyadmin.cn/n/5537191.html

相关文章

简单的手动实现spring中的自动装配案例

简简单单的实现一个spring中的自动装配和容器管理的小骚操作。 1&#xff0c;创建AutoSetBean.java 使用injectBeans静态方法&#xff0c;可以扫描指定包下的所有带MyInject注解的字段&#xff0c;如果在beans的Map中存在这个字段的实例化类&#xff0c;则执行装配。 import…

vue this.$refs加变量名

想动态获取$refs&#xff0c;我们可以用模板字符串来动态绑定ref的值。代码如下&#xff1a; this.$refs[${this.treeQueFlag}].setCheckedNodes([]); $refs后面拼变量&#xff0c;vue动态给$refs赋值_vue ref动态赋值-CSDN博客

Docker的基本介绍

Docker 简单介绍 基本概念 镜像 docker 镜像好比一个模板&#xff0c;可以通过这个模板来创建容器服务&#xff0c;是一种轻量级、可执行的软件包&#xff0c;包含运行应用程序时所需要的一切&#xff1a;代码、运行时、库、环境变量、配置文件等 所有的应用打包成一个 doc…

uniapp中实现瀑布流 短视频页面展示

直接上干货 第一部分为结构 <swiper class"list" :currentindex change"swiperchange" scrolltolower"onReachBottom"><swiper-item style"overflow: scroll;" v-for"(item,index) in 2" :key"index"&g…

网络安全筑基篇——反序列化漏洞

目录 序列化是什么&#xff1f; 反序列化又是什么&#xff1f; 反序列化漏洞的危害 代码样例 常见的魔术方法 修复方式有哪些&#xff1f; 常见的反序列化漏洞 Shiro反序列化漏洞 Fastjson反序列化漏洞 序列化是什么&#xff1f; 将实例化对象转换成字节流的过程 反序…

矩阵运算在数据分析中的应用

矩阵运算在数据分析中的应用 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 矩阵运算作为数学和计算机科学中的重要概念&#xff0c;在数据分析和科学计算中发…

类和对象-C++运算符重载-加号运算符重载

加号运算符重载 1、成员函数重载号 #include<iostream>using namespace std;class Person { public://1、成员函数重载号Person operator(Person &p){Person temp;temp.m_Athis->m_Ap.m_A;temp.m_Bthis->m_Bp.m_B;return temp; }int m_A;int m_B; }; void t…

【数据集】中国农田栅格数据CACD(1986-2021)

中国农田栅格数据(1986-2021) 数据概述数据下载参考精确、详细和及时的耕地范围信息对于保障食品安全和环境可持续性至关重要。然而,由于农业景观的复杂性以及缺乏足够的训练样本,要在大范围地理区域内高空间和时间分辨率下监测耕地动态仍然具有挑战性,特别是对于农业土地…