C语言 DAY08 指针01

这篇具有很好参考价值的文章主要介绍了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()

                { 文章来源地址https://www.toymoban.com/news/detail-744953.html

                //野指针
                        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);
        }

到了这里,关于C语言 DAY08 指针01的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言假期作业 DAY 01

    1、执行下面程序,正确的输出是( )   int x=5,y=7; void swap() {         int z;         z=x;         x=y;         y=z; } int main() {         int x=3,y=8;         swap();         printf(\\\"%d,%dn\\\",x, y);         return 0; } A: 5,7   B: 7,5   C: 3,8   D: 8,3 2、以下不正

    2024年02月15日
    浏览(34)
  • 从零开始的c语言日记day36——指针进阶

    一、什么是指针: 指针的概念:1.指针就是个变量,用来存放地址,地址唯一标识一块内存空间。 ⒉指针的大小是固定的4/8个字节(32位平台/64位平台)。 指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时候的权限。4.指针的运算。 字符指针 用字符指针

    2024年02月05日
    浏览(38)
  • Wpf 使用 Prism 实战开发Day01

    1.  VisualStudio 2022 2.  . NET SDK 7.0 3.  Prism 版本 8.1.97 以上环境,如有新的版本,可自行选择安装新的版本为主 项目名称:这里只是记录学习,所以随便命名都无所谓,只要觉得合理就行 注意: 下载的包名是 Prism.DryIoc 。为什么不是Prism.xxx其他包,而是 Prism.DryIoc ,别问我,我也不

    2024年02月08日
    浏览(43)
  • DAY08_MyBatisPlus——入门案例&标准数据层开发CRUD-Lombok-分页功能&DQL编程控制&DML编程控制&乐观锁&快速开发-代码生成器

    问题导入 MyBatisPlus环境搭建的步骤? 1.1 SpringBoot整合MyBatisPlus入门程序 ①:创建新模块,选择Spring初始化,并配置模块相关基础信息 ②:选择当前模块需要使用的技术集(仅保留JDBC) ③:手动添加MyBatisPlus起步依赖 注意事项1:由于mp并未被收录到idea的系统内置配置,无法直

    2024年02月09日
    浏览(45)
  • 面试题 08.01. 三步问题

    ​​ 题目来源:         leetcode题目,网址:面试题 08.01. 三步问题 - 力扣(LeetCode) 解题思路:         动态规划。1 阶楼梯 1 种走法,2 阶楼梯 2 种走法,3 阶楼梯 6 种类走法。假设有 n(n3) 阶楼梯,n-1 阶楼梯有 a 种走法,n-2 阶楼梯有 b 种走法,n-3 阶楼梯有 c 种走法,则

    2024年02月10日
    浏览(32)
  • LeetCode 面试题 01.08. 零矩阵

      编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。   点击此处跳转题目。 示例 1: 输入: [ [1,1,1], [1,0,1], [1,1,1] ] 输出: [ [1,0,1], [0,0,0], [1,0,1] ] 示例 2: 输入: [ [0,1,2,0], [3,4,5,2], [1,3,1,5] ] 输出: [ [0,0,0,0], [0,4,5,0], [0,3,1,0] ]   此题有很多方法解,

    2024年02月11日
    浏览(44)
  • day2 驱动开发 c语言

    通过驱动开发给pcb板子点灯。 u-boot已经提前移植到了emmc中。 灯也是一种字符型设备。 编程流程需要先注册设备,然后创建结点,然后操作电灯相关寄存器 应用层直接调用read write来打开字符设备进行操作。 这样写会造成无法处理内核页面请求的虚拟地址内部错误,没找到解

    2024年02月15日
    浏览(36)
  • 2023-08-01 LeetCode每日一题(英雄的力量)

    点击跳转到题目位置 给你一个下标从 0 开始的整数数组 nums ,它表示英雄的能力值。如果我们选出一部分英雄,这组英雄的 力量 定义为: i 0 ,i 1 ,… i k 表示这组英雄在数组中的下标。那么这组英雄的力量为 max(nums[i0],nums[i1] … nums[ik])2 * min(nums[i0],nums[i1] … nums[ik]) 。 请你

    2024年02月14日
    浏览(61)
  • day3 驱动开发 c语言编程

    通过ioctl(内核+应用层) 控制led灯三盏,风扇,蜂鸣器,小马达 头文件head.h 内核代码 ioctldev.c 应用层代码 ioctl.c

    2024年02月16日
    浏览(56)
  • day4 驱动开发 c语言学习

    不利用系统提供的register_chrdev,自己实现字符设备的注册 底层代码 led.c 应用层代码 app.c 头文件 head.h

    2024年02月14日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包