c/c++:指针,指针定义和使用,指针大小4字节,野指针,空指针*p=NULL

news2024/10/7 6:43:55

c/c++:指针,指针定义和使用,指针大小4字节,野指针,空指针*p=NULL

2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c++的话,
我所知道的周边的会c++的同学,可手握10多个offer,随心所欲,而找啥算法岗的,基本gg
提示:系列c++学习的基础和高阶知识,用于公司生产实践中,实实在在的公司部署产品要用的,因为c++速度快,
而java和Python速度慢,自然往硬件里面部署算法啥的,都得用c++或者c,因此本科学的c很重要,后来的Python或者java就没有那么重要了,
c/c++系列文章:
【1】c++:c语言优缺点,visual studio2019如何新建项目,写hello world程序
【2】c/c++:gcc安装,gcc编译hello world文件,system函数调用系统命令,sleep函数
【3】linux下gcc的编译过程和功能,预处理,编译,汇编,链接,.c预处理为.i文件.s文件.o文件.exe文件
【4】c/c++:windows平台下依赖的动态库,c底层是汇编语言,程序断点调试,反汇编,vs快捷键
【5】c/c++:数据类型,常量变量,标识符,有符号整型,无符号unsigned,字符类型,字符串类型,实数类型,浮点型,科学计数法
【6】c/c++:2进制、8进制、10进制、16进制和进制之间的转换,c语言输出匹配格式%
【7】c/c++:原码,反码,补码和常见的数据类型取值范围,溢出
【8】c/c++:类型限定符,printf输出格式,putchar,scanf,getchar
【9】c/c++:算术运算符,赋值运算,逻辑运算,比较运算,三目运算,逗号运算,数据类型转换
【10】c/c++:顺序结构,if else分支语句,do while循环语句,switch case break语句
【11】c/c++:for循环语句,分号不可省略,表达式可以省略,猜数字游戏,跳转语句continue,break,避免写goto
【12】c/c++:一维数组,初始化数组,循环打印数组,计算数组存储空间,数组元素个数,数组逆序算法
【13】c/c++:二维数组,数组的行数和列数求法sizeof,数组初始化不同形式,5个学生,3门功课,求学生总成绩和功课总成绩
【14】c/c++:visual studio的代码快捷键,VS设置自定义默认代码,使用快捷键
【15】c/c++:三维数组,字符数组和字符串,统计字符串中字符出现的频次,scanf输入空格,正则匹配表达式
【16】c/c++:gets(),fgets(),puts(),fputs(),strlen(),字符串拼接函数
【17】c/c++:函数的作用,分类,随机数,函数定义,调用,申明,exit()函数,多文件编程,防止头文件重复


文章目录

  • c/c++:指针,指针定义和使用,指针大小4字节,野指针,空指针*p=NULL
    • @[TOC](文章目录)
  • c/c++:指针,即地址
  • 指针的定义和使用,int *p=&a,
  • 指针的大小
  • 野指针,未知指向的指针
  • 空指针NULL
  • 总结

c/c++:指针,即地址

在这里插入图片描述
指针就是地址
内存单元,是计算机中,内存最小的存储单位,放一个字节,8bit

咱现在只看字节

指针,就是这个字节的地址编址【编号,唯一】
指针,就是这个字节的地址编址【编号,唯一】
指针,就是这个字节的地址编址【编号,唯一】

在这里插入图片描述

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include<Windows.h>

void f55(void)
{
    int a = 55;
    printf("%x\n", &a);//a的地址,即指针

}

int main(void)
{
    f55();

    system("pause");
    return 0;
}

在这里插入图片描述
一个int占4字节
在这里插入图片描述
代表a的地址,即指针就是0133F700
读的时候,自动读4个字节,即我们的数据
在这里插入图片描述
指针变量呢?
存地址的变量。

指针的定义和使用,int *p=&a,

或者int* p=&a
int类型的变量
*p即地址指针
赋为地址&a

int p是windows写法
int p是Linux写法

都对的

相当于定义了一个p变量,但是它的空间,存的是地址,而不是其他类型的变量
在这里插入图片描述
a定义好了,然后p指向这个a的地址的
在这里插入图片描述
再让
p=250,这叫解引用,啥意思呢?
简洁引用地址
p是一个指针,地址指向了a变量
p=250,就是间接让a=250

这很重要的概念,不再是说p这个地址内容为250,你要理解懂?

原来
m=10,m在等号左边,代表10往m里面存东西
n=20
n=m,m在等号的右边,代表m取值,取内容

在这里插入图片描述

现在看
*p=250

将p变量的内容取出,当地址,找到该地址对应的内容空间
看*p是在等号的左边,还是在等号的右边
做左值,代表存数据到空间中
做右值,取出空间中的数据

是不是和常规变量赋值一样的。

只不过,往p里面的地址代表的空间中操作数据

在这里插入图片描述

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include<Windows.h>

void f55(void)
{
    int a = 10;
    printf("最开始a = %d\n", a);

    int* p = &a;//存a的地址
    *p = 2000;//左值,取这个a空间,存入2000
    printf("%x\n", &a);//a的地址,即指针
    printf("后来a = %d\n", a);

}

int main(void)
{
    f55();

    system("pause");
    return 0;
}

最开始,a=10
p存了a的地址
在这里插入图片描述
现在
p=2000
就是说找到p这个地址所指向的a,把2000赋值给a
在这里插入图片描述
验证代码
在这里插入图片描述
确实,p存放的a的地址时不变的
变化的是p间接指向的a

再感受一下代码,一步步都是怎么来的

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include<Windows.h>

void f55(void)
{
    int a = 10;
    printf("最开始a = %d\n", a);

    int* p = &a;//存a的地址
    printf("%x\n", &a);//a的地址,即指针
    printf("p地址指向的内容是%d\n", *p);//a的地址,即指针

    *p = 2000;//左值,取这个a空间,存入2000
    printf("后来a = %d\n", a);
    printf("p地址指向的内容是%d\n", *p);

}

int main(void)
{
    f55();

    system("pause");
    return 0;
}

在这里插入图片描述
在printf中,*p可就是右值了,右值是取内容哦

所以,指针的玩法,就是通过地址去玩变量,懂了吧。

指针的大小



void f56(void)
{
    int a = 10;
    int* p = &a;//存a的地址
    printf("int* :%d\n", sizeof(int*));
    printf("short* :%d\n", sizeof(short*));
    printf("long* :%d\n", sizeof(long*));
    printf("char* :%d\n", sizeof(char*));
    printf("double* :%d\n", sizeof(double*));
    printf("void* :%d\n", sizeof(void*));


}

在这里插入图片描述
其实,一律都是4字节
为啥呢
因为*p是放地址的
一个地址自然就是4字节

指针的大小与类型无关
与当前使用的系统有关
32位系统
64位系统

懂了吧

32位bit
在这里插入图片描述
在这里插入图片描述
懂了吧

野指针,未知指向的指针

没有一个有效的地址空间的指针

int *p;
*p=1000;

你没有指针地址之前就用,那就是野指针

在这里插入图片描述
随机一个数,能当有效地址吗?


void f57(void)
{
    int* p;
    printf("未赋值的指针:%x\n", *p);
    *p = 2000;
    
    //printf("%d\n", *p);
}

在这里插入图片描述
p在编译时,它不会让你通过的
因为
p是野指针,所以,不能玩

p变量有一个值了,但是这个值,不是可访问的内存区域,这时候*p也是野指针

int *p =10;
*p=2000;

10这个地址,操作系统默认不让动的
0–255这块区域,是不能随便写的
在这里插入图片描述
这也是野指针
所以不让你玩
懂?

在这里插入图片描述
正常使用,就是你要把某个变量的地址赋给p
然后才能正常使用
p
在这里插入图片描述
当然你也可以直接写个地址,但是最好别这么搞
最好是另外申请变量,将它的地址给*p
懂了吧

编程一定要杜绝野指针,否则系统gg
编程一定要杜绝野指针,否则系统gg
编程一定要杜绝野指针,否则系统gg

后面的话,怎么解决这种投机行为
那就用空指针

在这里插入图片描述

空指针NULL

在这里插入图片描述
0号地址
不能用哇?

咱们判断一下最好
如果p不是NULL,再去赋值最合适


void f57(void)
{
    int* p=NULL;//NULLL=0
/*
    int a = 10;
    *p = &a;
    printf("赋值的指针:%d\n", *p);
*/
    if (p != NULL)//判空是最合适的
    {
        *p = 2000;
        printf("*p:%d\n", *p);
    }
    
    //printf("%d\n", *p);
}

这样就是最合适的


总结

提示:重要经验:

1)
2)学好c++,即使经济寒冬,手握10个大厂offer绝对不是问题!
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

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

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

相关文章

VMware开机自启虚拟机系统

一、前提 wmware开机自启&#xff0c;安装完毕wmware不用管&#xff0c;默认该软件以及相关服务就是开机自启准备waware虚拟机&#xff08;一般都linux&#xff0c;我用centos7&#xff0c;你随意&#xff09; 二、脚本 脚本命令如下&#xff0c;等待30秒&#xff08;给服务自启…

NXP公司K20+PF8100实现硬件窗口看门狗

Kinetis K20 72 MHz MCU系列为中等性能的Kinetis产品组合提供了可扩展的入门级产品&#xff0c;具有差异化的集成&#xff0c;配备高精度模拟集成和灵活的低功耗功能。其相关资源可在NXP的官网获得。 PF81/PF82为PMIC系列专为高性能处理应用而设计&#xff0c;如娱乐中控、车载…

阅读完synchronized和ReentrantLock的源码后,我竟发现其完全相似

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到升仙…

【数据结构】七大排序之快速排序详解(挖坑法快排,非递归快排,二路快排,三路快排)

目录 1.快速排序核心思路 2.挖坑法快速排序&#xff08;递归&#xff09; 2.1步骤 2.2代码&#xff08;详细注释&#xff09; 3.非递归快排&#xff08;用栈实现快速排序&#xff09; 3.1思路 3.2代码 4.二路快排 4.1思路 4.2代码 5.三路快排 5.1思路 5.2代码 1.快速…

大白话chatGPT及其原理之快速理解篇

大白话chatGPT及其原理之快速理解篇 从GPT名字理解chatGPTchatGPT三步曲 声明&#xff1a;本文为原创&#xff0c;未经同意请勿转载&#xff0c;感谢配合&#x1f604; chatGPT今年年初的时候是非常火爆的&#xff0c;现在也有很多相关的应用和插件。当然现在也有很多新的技术出…

老宋 带你五分钟搞懂vue

Vue 1.1 什么是框架 任何编程语言在最初的时候都是没有框架的&#xff0c;后来随着在实际开发过程中不断总结『经验』&#xff0c;积累『最佳实践』&#xff0c;慢慢的人们发现很多『特定场景』下的『特定问题』总是可以『套用固定解决方案』。于是有人把成熟的『固定解决方案…

袋鼠云春季生长大会圆满落幕,带来数实融合下的新产品、新方案、新实践

4月20日&#xff0c;以“数实融合&#xff0c;韧性生长”为主题的袋鼠云春季生长大会圆满落幕。 在春季生长大会中&#xff0c;袋鼠云带来了数实融合趋势下的最新行业沉淀、最佳实践经验和行业前瞻性的产品发布。从大数据基础软件“数栈”、到低代码数字孪生世界“易知微”&…

离散数学-考纲版-01-命题逻辑

文章目录 1. 命题逻辑的等值演算与推理演算参考1.1 命题1.2 常用联结词1.3 命题公式命题公式的分类-重言式-矛盾式-可满足式等价关系式-逻辑等价 logically equivalent 1.4 命题的等值演算与推理基本等价式逻辑蕴涵重言式 logically implication重言蕴涵推到归结法 1.5 命题公式…

log4j2日志简单使用

log4j2日志使用 1、log4j2介绍 Apache Log4j2是对Log4j的升级版&#xff0c; log4j2借鉴了logback的一些优秀的设计&#xff0c;并且修复了一些问题&#xff0c;因此带来了一些重大的提升&#xff0c;主要有&#xff1a; 1、异常处理&#xff1a;在logback中&#xff0c;Appe…

Makefile通用模板

工程目录 假如我们有以下目录结构&#xff1a; . ├── inc │ ├── add.h │ └── sub.h ├── main.c └── src├── add.c└── sub.c文件中的内容如下&#xff1a; //main.c #include <stdio.h> #include "add.h" #include "sub.h&q…

Mysql 学习(六)Mysql的数据目录

数据库中数据的存放 Mysql中 InnoDB 和 MyISAM 这样的存储引擎都是把数据存储到磁盘上的&#xff0c;而我们把这种存放到磁盘上的东西叫做文件系统&#xff0c;当我们想读取对应数据的时候&#xff0c;就会把数据从文件系统上加载&#xff0c;并且处理返回给我们&#xff0c;当…

每日学术速递4.19

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Visual Instruction Tuning 标题&#xff1a;可视化指令调优 作者&#xff1a;Haotian Liu, Chunyuan Li, Qingyang Wu, Yong Jae Lee 文章链接&#xff1a;https://arxiv.org/ab…

Midjourney:一步一步教你如何使用 AI 绘画 MJ

一步一步如何使用 Midjourney 教程&#xff1a;教学怎么用 MJ&#xff1f; 一、Midjourney&#xff08;MJ&#xff09;是什么&#xff1f; Midjourney是一款使用文字描述来生成高质量图像的AI绘画工具。这篇文章主要介绍了Midjourney及其用途&#xff0c;并针对Midjourney的使…

python 定时任务执行命令行

1.使用场景&#xff1a; 定时执行jmeter脚本&#xff0c;通过python定时器隔一段时间执行命令行命令。 2.库&#xff1a; os、datetime、threading &#xff08;1&#xff09;利用threading.Timer()定时器实现定时任务 Timer方法说明Timer(interval, function, argsNone, k…

如何利用python实现TURF分析?

1.TRUF分析简介 TURF分析(Total Unduplicated Reach and Frequency)是累计净到达率和频次分析的简称。最初被应用于媒介研究领域。典型应用场景是&#xff0c;在既定条件下&#xff0c;例如预算等资源限制或就当前实施的媒体组合投放计划&#xff0c;哪些渠道组合能让广告投放…

【三十天精通Vue 3】第十二天 Vue 3 过滤器详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录 引言一、Vue 3 过滤器概述1.1 过滤器的简介1.2 过滤器的作用1.3 过…

WEB通用漏洞水平垂直越权详解业务逻辑访问控制脆弱验证

目录 一、知识点概述 <分类> <原理简述> 二、水平越权示例——检测数据比对弱 <越权演示> <如何防护> 三、垂直越权示例——权限操作无验证 <越权演示> <漏洞成因> 四、访问控制示例——代码未引用验证 <越权演示> 五、脆…

如何才能写出一个符合预期的正则?

如何才能写出一个符合预期的正则&#xff1f; 正则表达式入门示例讲解1、java里正则表达式replaceAll连续的字符正则测试题主问题讲解 2、开发者遇到金额的校验正则描述正则测试 3、java正则表达式匹配字符串正则描述正则测试 4、关于#正则表达式#的问题&#xff0c;如何解决&a…

0基础自学软件测试 用这个方法 99%的人都成功了

对于大多数0基础的小白而言&#xff0c;刚开始学软件测试&#xff0c;肯定会遇到各种各样的难题&#xff0c;有时候问题多了&#xff0c;扛不住了&#xff0c;导致最后无法坚持&#xff0c;或者学的很杂&#xff0c;学而不精。 那么有哪些比较有效的方法和技巧&#xff0c;可以…

系统分析师之数据库系统(七)

目录 一、数据库概念 1.1 数据库管理系统DBMS 1.2 数据库系统DBS 二、数据库设计 2.1 数据库设计过程 2.2 E-R模型 2.3 关系代数 2.4 规范化理论 2.4.1 价值与用途 2.4.2 函数依赖 2.4.3 键 2.4.4 范式 2.4.5 无损分解 三、并发控制 3.1 基本概念 3.2 问题示例…