指针笔记

2023-05-16

指针的两种写法注意:
int c=1;
int *p=&c

int *p;
p=&c;
这两种写法是相等的。

另外注意野指针的概念:(1)野指针的错误来源就是指针定义了以后没有初始化,也没有赋值(总之就是指针没有明确的指向一个可用的内存空间),然后去解引用。
(2)知道了野指针产生的原因,避免方法就出来了:在指针的解引用之前,一定确保指针指向一个绝对可用的空间。
(3)常规的做法是:
第一点:定义指针时,同时初始化为NULL
第二点:在指针解引用之前,先去判断这个指针是不是NULL
第三点:指针使用完之后,将其赋值为NULL
第四点:在指针使用之前,将其赋值绑定给一个可用地址空间
(4)野指针的防治方案4点绝对可行,但是略显麻烦。很多人懒得这么做,那实践中怎么处理?在中小型程序中,自己水平可以把握的情况下,不必严格参照这个标准;但是在大型程序,或者自己水平感觉不好把握时,建议严格参照这个方法。

注:
char *s=“Hello,world”;
这句语句的 Hello,world 字符串是存放在常量区的,不能够对此区数据进行更改,也就是 指针 s 指向的地址是常量区,此区的数据不能够更改。比如 说 更改 ‘e’ 为’a’ s[1] = ‘a’; 程序运行会崩溃。

char s[] = “Hello world”;
这句语句则不同,因为现在 s是数组。数据存放在栈或静态存储区中,即此时的Hello world 存放在栈或静态存储区中。可以改变数组的值。


对指针数组和数组指针的概念,相信很多C程序员都会混淆。下面通过两个简单的语句来分析一下二者之间的区别,示例代码如下所示:
int p1[5];
int (p2)[5];
首先,对于语句“int
p1[5]”,因为“[]”的优先级要比“
”要高,所以 p1 先与“[]”结合,构成一个数组的定义,数组名为 p1,而“int*”修饰的是数组的内容,即数组的每个元素。也就是说,该数组包含 5 个指向 int 类型数据的指针,如图 1 所示,因此,它是一个指针数组。

在这里插入图片描述

其次,对于语句“int(p2)[5]”,“()”的优先级比“[]”高,“”号和 p2 构成一个指针的定义,指针变量名为 p2,而 int 修饰的是数组的内容,即数组的每个元素。也就是说,p2 是一个指针,它指向一个包含 5 个 int 类型数据的数组,如图 2 所示。很显然,它是一个数组指针,数组在这里并没有名字,是个匿名数组。

图 2在这里插入图片描述

由此可见,对指针数组来说,首先它是一个数组,数组的元素都是指针,也就是说该数组存储的是指针,数组占多少个字节由数组本身决定;而对数组指针来说,首先它是一个指针,它指向一个数组,也就是说它是指向数组的指针,在 32 位系统下永远占 4 字节,至于它指向的数组占多少字节,这个不能够确定,要看具体情况。

了解指针数组和数组指针二者之间的区别之后,继续来看下面的示例代码:
int arr[5]={1,2,3,4,5};
int (*p1)[5] = &arr;
/下面是错误的/
int (*p2)[5] = arr;
不难看出,在上面的示例代码中,&arr 是指整个数组的首地址,而 arr 是指数组首元素的首地址,虽然所表示的意义不同,但二者之间的值却是相同的。那么问题出来了,既然值是相同的,为什么语句“int(p1)[5]=&arr”是正确的,而语句“int(p2)[5]=arr”却在有些编译器下运行时会提示错误信息呢(如在 Microsoft Visual Studio 2010 中提示的错误信息为“a value of type"int"cannot be used to initialize an entity of type"int()[5]"”)?

其实原因很简单,在 C 语言中,赋值符号“=”号两边的数据类型必须是相同的,如果不同,则需要显示或隐式类型转换。在这里,p1 和 p2 都是数组指针,指向的是整个数组。p1 这个定义的“=”号两边的数据类型完全一致,而 p2 这个定义的“=”号两边的数据类型就不一致了(左边的类型是指向整个数组的指针,而右边的数据类型是指向单个字符的指针),因此会提示错误信息。


如const char*z[]={“sdg”,“dsg”,“eav”,“eqw”};
const char **w=z; //二级指针存储的是指针数组首元素的地址
printf("%s\n",*w); 输出为sdg.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

指针笔记 的相关文章

随机推荐

  • 51单片机0-99秒表计数器+60秒倒计时(数码管两位数)

    51秒表计数器 43 倒计时 xff08 数码管两位数 xff09 一 xff1a 简介 我们实践的效果是用数码管显示0 99并在按下 转换键 后 xff0c 实现60秒倒计时 xff0c 并用蜂鸣器报警提示 xff0c 兼并计数器和倒计时
  • 系统调用的理解

    文章目录 系统调用什么是系统调用系统调用的分类系统调用与库函数的区别 系统调用 什么是系统调用 什么是系统调用 xff1f 答 操作系统的接口函数是连接应用软件与操作系统的中间桥梁 xff0c 系统调用其实就是操作系统提供给应用程序的接口函
  • AndroidStudio配置过程中遇到的一些问题

    自己在安装并配置Android Studio时遇到的一些坑 xff0c 写出来方便大家解决问题 问题一 xff1a BUILD FAILED in 1s Failed to create parent directory C Program
  • STM32F103C8T6汇编点灯

    最简单的结构 只有一个数据段 只是为了不报错而已 area Reset span class token punctuation span data span class token punctuation span readonly sp
  • vscode c++连接mysql

    因为踩坑太多所以写下该篇博客 首先要下载mysql 这里用的是MySQL8 0 16 记住mysql的安装路径 xff0c 主要是include和lib的路径 参考另外一个博主的文章https blog csdn net mzlogin a
  • python之 下载及安装Anaconda

    Python Python是一种面向对象的解释型计算机程序设计语言 xff0c 其使用 xff0c 具有跨平台的特点 xff0c 可以在Linux macOS以及Windows系统中搭建环境并使用 xff0c 其编写的代码在不同平台上运行时
  • UI自动化之TouchAction(dirver).long_press()长按

    之前篇说过driver tap可以通过duration参数设置实现长按 xff0c 除外TouchAction也可以 xff0c 而且还可以用之实现多个点击的事件集 xff0c 废话不多说直接贴码 xff1a span class toke
  • python之 ffmpeg+opencv绿幕抠图,蒙版绿幕抠图,透明化处理,PIL检测图片是否包含透明通道

    目录 OpenCV Python实现绿幕图像抠图 python利用蒙版批量抠图并实现透明化 jpeg格式图片进行批量背景透明化处理 PIL检测图片是否包含透明通道 OpenCV Python实现绿幕图像抠图 boy png xff1a 最终
  • pandas将千万行数据分块保存为CSV文件,保存为HDF5文件

    从数据库读取数据保存为CSV xff0c 然后转换为HDF5 xff0c 用于后面数据快速处理 span class token keyword from span sqlalchemy span class token keyword i
  • NOIP 2002 普及组第四题 过河卒

    题目描述 棋盘上 A 点有一个过河卒 xff0c 需要走到目标 B 点 卒行走的规则 xff1a 可以向下 或者向右 同时在棋盘上 C 点有一个对方的马 xff0c 该马所在的点和所有跳跃一步可达的点称为对方马的控制点 因此称之为 马拦过河
  • Ubuntu18.04安装

    一 制作系统U盘 1 下载Ubuntu18 04系统镜像文件 进入Ubuntu官网 xff0c 先找到Download xff0c 再找到以前的发行版本 older releases xff1a 选择64位的Desktop image xf
  • maven下手动导入ojdbc6-12.1.0.1-atlassian-hosted.jar

    在终端输入如下命令 xff1a mvn install install file Dfile 61 E ojdbc6 12 1 0 1 atlassian hosted jar DgroupId 61 com oracle Dartifac
  • BIOS 和 UEFI

    BIOS 和 UEFI 是电脑的两种启动模式 xff0c 也就是开机后最先执行的程序 它们都是固件 xff0c 程序已经预先写入到芯片中 BIOS是传统的启动方式 xff0c UEFI是一种新的启动方式 xff0c 现在的出的电脑基本都是用
  • 安装双系统后直接进入Ubuntu没有grub引导项

    解决问题 xff1a 安装win10 43 Ubuntu18 04双系统后 xff0c 开机直接进入Ubuntu没有grub引导项 原因 xff1a 没有为Ubuntu的启动项配置grub 如何配置 xff1f 首先在终端执行如下命令打开g
  • VNC 配置使用

    被控制的计算机系统Ubutnu18 04 xff0c 控制的计算机系统Windows10 1 下载 Download VNC Server VNC Connect 被控制的计算机下载Server版 xff0c 控制的计算机下载Viewer版
  • UTC和GMT的区别

    GMT xff1a Greenwich Mean Time 格林尼治标准时间 是以英国格林尼治天文台观测结果得出的时间 xff0c 这是英国格林尼治的当地时间 xff0c 是世界时间的标准 UT xff1a Universal Time 世
  • 基于MAML的改进方法总结

    元学习是解决小样本学习问题的重要方法之一 xff0c 现已取得较为优异的成绩 元学习方法大体上可以分为基于优化的和基于度量两种 基于度量的方法是非参数方法 xff0c 包括孪生网络 关系网络 匹配网络等 基于优化的方法是参数化方法 xff0
  • list与dict互转

    keys span class token operator 61 span span class token punctuation span span class token string 39 a 39 span span class
  • 进栈出栈操作

    首先简单输入n 代表输入数字的个数 xff0c 然后依次进栈 xff0c 再出栈输出每个数字 xff08 栈是一种先进后出的数据结构 xff09 span class token macro property span class toke
  • 指针笔记

    指针的两种写法注意 xff1a int c 61 1 int p 61 amp c 或 int p p 61 amp c xff1b 这两种写法是相等的 另外注意野指针的概念 xff1a 1 野指针的错误来源就是指针定义了以后没有初始化 x