C语言 DAY08 指针01

1.概述

        地址编号:地址编号:就是计算机为了存储数据,每一个程序在32机中占4G,以一个字节为最小单位进行操作,每一个字节都有其对应的地址,该地址就是地址编。

        指针:地址编号的数据类型

        指针变量:存储地址编号的变量,其数据类型为指针

在32位机中一个指针占4B

64 位机中一个指针占 8B
代码:

#include<stdio.h>

int main(int argc, char const *argv[])

{

    printf("char *的大小为:%ld\n",sizeof(char *));

    printf("int *的大小为:%ld\n",sizeof(int *));

    printf("short *的大小为:%ld\n",sizeof(short *));

    printf("long *的大小为:%ld\n",sizeof(long *));

    printf("float *的大小为:%ld\n",sizeof(float *));

    printf("double *的大小为:%ld\n",sizeof(double *));

    return 0;

}

2.指针变量

指针变量实质上是一个变量,存放的是数据类型为指针的地址编号

1.定义:

        数据类型   变量名

2.分类:

        char *  储存数据类型为字符型的地址编号        字符指针

        int    *  储存数据类型为整型的地址编号            整型指针

        short  *储存数据类型为短整型的地址编号         短整型指针

        long   *储存数据类型为长整型的地址编号         长整型指针

        float   *储存数据类型为float的地址编号              单精度浮点型指针

        double *储存数据类型为double的地址编号       双精度浮点型指针

如:

        int  num = 10;

        int  *p ;

注意:

        如果同时定义多个指针变量的时候,每个指针变量前都要加*

       如:

        void fun()

        {

                int a,b,c;

                int *p1,*p2,*p3;

        }

初始化:

1,当指针变量是局部变量,在其定义时没有给其值,此时系统将随机为其给一个值,这种指针称为野指针
        如:
        int *p;
2,当指针变量值等于NULL时,这种指针称为空指针
        如:
        int *p = NULL;
3,定义指针变量时赋真实的地址
如:
        int num = 10;
        int *p = &num;
如:

        int num = 10;

        int *p ;

        p = &num;

运算符:

&

        作用:取地址

        &要取地址的变量

        注意:只能获取变量的地址

        代码 :

                #include <stdio.h>

                char c = 'a';

                int main(int argc, char const *argv[])
                {
                        int num = 10;
                        int *p = &num;
                        printf("p = %p\n",p);
                        char *p2 = &c;
                        printf("p2 = %p\n",p2);
                        //int *p3 = &10;
                        const int num02 = 10;
                        int *p4 = &num02;
                        printf("p4 = %p\n",p4);
                        return 0;
                }

*

     作用:取值或改值

        *指针变量名   

示例 

        #include <stdio.h>

        int main(int argc, char const *argv[])
        {
                int num = 10;
                int *p = #//此时* 表示变量 p int 型的指针变量
                printf("*p=%d\n",*p);//此时* 表示为取值
                *p = 1;//修改p 指向的地址的值
                printf("num=%d\n",num);
                return 0;
        }

3.指针类型

指针本身的类型

        口诀:将指针变量的变量名去除,剩余的就是指针本身的类型

        如:

                int *p1;// int *

                int **p2;//int **
        
                int (*p)(int int);//int (*)(int,int)
                ...
        示例:
                int num = 10;
                int *p = &num ;
                char *p2 = &num;

指针指向的数据的数据类型

        口诀:将指针变量的变量名和与它离得最近的*去除 , 剩余的就是指针本身的类型
        如:
                

                int *p1;// int 

                int **p2;//int *
        
                int (*p)(int int);//int (int,int)

取值宽度

指针变量的数据类型的长度就是指针的取值宽度
char *   取值宽度 1
int *      取值宽度  4
float *   取值宽度  4

单位跨度(步长)

就是地址在进行加减时,地址所增减的数据类型的长度(字节数)
 int * 单位跨度为4字节
        char * 单位跨度为1字节
        short * 单位跨度为2字节
        示例:
                 #include <stdio.h>
        int main(int argc, char const *argv[])
        {
                int num = 0x01020304;
                char *p = (char* )&num;
        /*
        注意: liunx 系统中数据存储将倒序
        所以num 在内存中存储的顺序为
        0x04 0x03 0x02 0x01
        将num 地址强制转换为 char * 类型
        此时取值宽度为1 字节 , 单位跨度为 1 字节
        p为首个字节存储的地址 +1, 加的是一个单位跨度即 1 字节
        所以从第二个字节开始取1 个字节长度的数据
        即0x03
        */
                printf("%#p\n",*(p+1));
        /*
        将num 地址强制转换为 short * 类型
        此时取值宽度为2 字节 , 单位跨度为 2 字节
        p为首个字节存储的地址 +1, 加的是一个单位跨度即 2 字节
        所以从第三个字节开始取2 个字节长度的数据
        即:0x0102
        */
                short * p2 = (short *) &num;
                printf("%#p\n",*(p2+1));
                return 0;
        }

4.void

作用

        void与指针结合作为一种指针类型,void *,这种指针我们称为万能指针,意味着任何一种地址都可以赋值给类型的指针变量

示例      

#include <stdio.h>
int main(int argc, char const *argv[])
{
        int num01 = 10;
        char c = 'a';
        short s = 1;
//
        int *p1 = &num01;
        char *p2 = &c;
        short *p3 = &s;
//
        void *p4 = &num01;
        void *p5 = &c;
        void *p6 = &s;
        return 0;
}

5.指针变量使用的注意事项

1, 野指针操作会出现段错误

        定义一个局部变量的指针,并不给其赋值,它将不知道指向哪一块地址,所以叫野指针

        代码:

                void fun01()

                {

                //野指针
                        int *p;
                        printf("*p=%d\n",*p);
                }
2,空指针操作会出现段错误
    定义一个NULL的指针,叫空指针
        代码:
        
         void fun02()
        {
                //空指针
                int *p = NULL;
                printf("*p=%d\n",*p);
        }
    
        
3, 不要对万能指针进行操作
        
         void fun03()
        {
                int num = 10;
                int *p = &num;
                printf("*p=%d\n",*p);
                void *p2 = &num;
                printf("*p2=%d\n",*p2);
        }
4, 操作指针变量不要越界
代码:
         void fun04()
        {
                int num = 0x01020304;
                int *p = &num;
                char *p2 = (char *) p;
                printf("%#p\n",*p2);
                printf("%#p\n",*(p2+1));
                char c = 'a';
                char * p3 = &c;
                //1
                int *p4 = (int *)p3;
                printf("%#p\n",*p4);
        }

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

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

相关文章

【Java-代码-A02】(00) 通过Java遍历文件夹,快速上手;

前言 【描述】 通过"Java"遍历文件夹下的所有文件&#xff0c;快速上手&#xff1b; 【环境】 系统"Windows"&#xff0c;软件"IntelliJ IDEA 2021.1.3(Ultimate Edition)"&#xff1b;“Java版本"1.8.0_202”&#xff1b; 实操 【第一步…

SQL练习(牛客网非技术快速入门)

SQL3 查询结果去重 题目&#xff1a;现在运营需要查看用户来自于哪些学校&#xff0c;请从用户信息表中取出学校的去重数据。 示例:user_profile iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学Shanghai36543female20北京大学Beijing4…

Python武器库开发-常用模块之OS模块(十一)

常用模块之OS模块(十一) Python中的 os 模块提供了非常丰富的方法用来处理文件和目录&#xff0c;可以执行一些操作系统的功能。常用的方法如下表所示&#xff1a; 序号方法描述1os.access(path, mode)检验权限模式2os.chdir(path)改变当前工作目录3os.chflags(path, flags)设…

B-5:网络安全事件响应

B-5:网络安全事件响应 任务环境说明: 服务器场景:Server2216(开放链接) 用户名:root密码:123456 1.黑客通过网络攻入本地服务器,通过特殊手段在系统中建立了多个异常进程,找出启动异常进程的脚本,并将其绝对路径作为Flag值提交; 通过nmap扫描我们发现开启了22端口,…

JAVA学习笔记——接口

概念&#xff1a; 接口(Interface)是一种规范或协议(Protocal)&#xff0c;是由常量和抽象方法组成的特殊类&#xff0c;是对抽象类的进一步抽象&#xff0c;用于克服 Java 单继承的缺点。例如&#xff1a;每个厂商在生产鼠标的时候&#xff0c;鼠标的接口遵循了 USB 接口统一标…

C++特殊类的设计

文章目录 设计一个类不能被拷贝请设计一个类&#xff0c;只能在堆上创建对象设计一个类只能在栈上去创建对象设计一个类不能被继承设计一个类&#xff0c;只能创建一个对象(单例模式)饿汉模式懒汉模式 单例模式总结饿汉模式懒汉模式 设计一个类不能被拷贝 拷贝一个类对象可以有…

Kubernetes 概述以及Kubernetes 集群架构与组件

目录 Kubernetes概述 K8S 是什么 为什么要用 K8S K8S 的特性 Kubernetes 集群架构与组件 核心组件 Master 组件 Node 组件 ​编辑 Kubernetes 核心概念 常见的K8S按照部署方式 Kubernetes概述 K8S 是什么 K8S 的全称为 Kubernetes,Kubernetes 是一个可移植、可扩…

面试算法45:二叉树最低层最左边的值

题目 如何在一棵二叉树中找出它最低层最左边节点的值&#xff1f;假设二叉树中最少有一个节点。例如&#xff0c;在如图7.5所示的二叉树中最低层最左边一个节点的值是5。 分析 可以用一个变量bottomLeft来保存每一层最左边的节点的值。在遍历二叉树时&#xff0c;每当遇到新…

解决‘BaichuanTokenizer‘ object has no attribute ‘sp_model‘,无需重装transformers和torch

如https://github.com/baichuan-inc/Baichuan2/issues/204 中所说&#xff1a; 修改下 tokenization_baichuan.py &#xff0c;把 super() 修改到最后执行 self.vocab_file vocab_fileself.add_bos_token add_bos_tokenself.add_eos_token add_eos_tokenself.sp_model spm…

【AI数学】三维视觉中的四种坐标系

三维视觉中&#xff0c;需要掌握四种坐标系&#xff1a;世界坐标系、相机视角坐标系、NDC坐标系、屏幕坐标系。 世界坐标系&#xff08;World coordinate system&#xff09; 物体或者场景在真实世界中的位置。 相机视角坐标系&#xff08;Camera view coordinate system&…

13.1 linux命令行查看控制串口(uart)全攻略

linux命令行查看控制串口(uart)全攻略 本文主要内容: 1 串口启动驱动打印 2 sys目录下的串口信息 3 proc目录下的串口信息 4 etc目录下的串口信息 5 dev目录下的串口信息 6 stty控制具体的串口 7 命令行控制串口读写 8 串口数据解析 1 串口启动信息 root@am62xx-evm:~# dme…

springboot的spring.jackson.date-format失效解决

看起来数据库的格式非常完美,但是数据库字段look_date 是 datetime类型,java里没有datetime类型,这样一来如果你不在后端做处理,那么模型属性Date来接收一定会出问题.我通过实验证明最后拿到的是一个时间戳. 第一 解决时间格式问题 1.可以通过application.propertis配置文件中…

Linux 环境下 安装 Elasticsearch 7.13.2

Linux 环境下 安装 Elasticsearch 7.13.2 前言镜像下载&#xff08;国内镜像地址&#xff09;解压安装包修改配置文件用 Es 自带Jdk 运行配置 Es 可被远程访问然后启动接着启动本地测试一下能不能连 Es 前言 借公司的 centos 7 服务器&#xff0c;搭建一个 Es&#xff0c;正好熟…

Pod 进阶

//资源限制 当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小&#xff0c;以及其他类型的资源。 当为 Pod 中的容器指定了 request 资源时&#xff0c;调度器就使用该信息来决定将 Pod 调度到哪个节点上。当还为容器指定了 li…

基于图神经网络的联邦学习跨企业推荐

Federated Learning-Based Cross-Enterprise Recommendation With Graph Neural Networks 论文试图解决什么问题 该论文试图解决跨企业推荐系统中存在的数据共享和用户隐私保护的问题。在许多小型和中型企业中&#xff0c;由于资源有限&#xff0c;无法提供足够的数据来进行大…

HarmonyOS开发:开源一个刷新加载组件

前言 系统Api中提供了下拉刷新组件Refresh&#xff0c;使用起来也是非常的好用&#xff0c;但是风格和日常的开发&#xff0c;有着巨大的出入&#xff0c;效果如下&#xff1a; 显然上面的效果是很难满足我们实际的需求的&#xff0c;奈何也没有提供的属性可以更改&#xff0c;…

JVM虚拟机:通过一个例子解释JVM中栈结构的使用

代码 代码解析 main方法执行&#xff0c;创建栈帧并压栈。 int d8&#xff0c;d为局部变量&#xff0c;是基础类型&#xff0c;它位于虚拟机栈的局部变量表中 然后创建了一个TestDemo的对象&#xff0c;这个对象在堆中&#xff0c;并且这个对象的成员变量&#xff08;day&am…

Web渗透Java初学者文章汇总

Java框架可以变,基础不会变。 Java 是一门高级编程语言,由 Sun Microsystems(后来被 Oracle 收购)所开发,于 1995 年首次发布。Java 的设计目标是“一次编写,到处运行”(Write Once, Run Anywhere),也被称为 WORA。这意味着可以在不同的操作系统和硬件平台上运行同样…

京东API获得JD商品详情 item_get-获得JD商品详情

item_get-获得JD商品详情 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;获取key和secret接入secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_sear…

mysql之基础语句

数据库的列类型 int&#xff1a;整型 用于定义整数类型的数据 float&#xff1a;单精度浮点4字节32位 准确表示到小数点后六位 double&#xff1a;双精度浮点8字节64位 char&#xff1a;固定长度的字符类 用于定义字符类型数据&…