C语言中指针常见问题集

news2024/9/24 19:19:48

1. 我想声明一个指针并为它分配一些空间,但却不行。这些代码有什么问题?

char *p; 
*p = malloc(10);

答:你所声明的指针是p, 而不是*p, 当你操作指针本身时你只需要使用指针的名字即可:cp = malloc(10);当你操作指针指向的内存时,你才需要使用*作为间接操作符:*p = ’H’;

2. *p++自增p还是p所指向的变量?

答:后缀 ++ 和 – 操作符本质上比前缀一目操作的优先级高, 因此 *p++*(p++) 等价, 它自增 p 并返回 p 自增之前所指向的值。 要自增 p 指向的值, 使用(*p)++, 如果副作用的顺序无关紧要也可以使用 ++*p

3. 我有一个char*型指针正巧指向一些int型变量,我想跳过它们。为什么如下的代码不行?

((int *)p)++;

答:在 C 语言中, 类型转换意味着 “把这些二进制位看作另一种类型, 并作相应的对待”; 这是一个转换操作符, 根据定义它只能生成一个右值 (rvalue)。 而右值既不能赋值, 也不能用 ++ 自增。 (如果编译器支持这样的扩展, 那要么是一个错误, 要么是有意作出的非标准扩展)

// 要达到你的目的可以用
p = (char *)((int *)p + 1);

// 或者,因为 p 是 char * 型, 直接用
p += sizeof(int);

//但是, 在可能的情况下, 你还是应该首先选择适当的指针类型, 而不是一味地试图李代桃僵。

4. 我有个函数,它应该接收并初始化一个指针

void f(int *ip) 
{ 
    static int dummy = 5; 
    ip = &dummy;
}

但是当我如下调用时,调用者的指针却没有任何变化。

int *ip;
f(ip);

答:你确定函数初始化的是你希望它初始化的东西吗? 请记住在 C 中, 参数是通过值传递的。被调函数仅仅修改了传入的指针副本。你需要传入指针的地址 (函数变成接受指针的指针), 或者让函数返回指针。

5. 我能否用void**指针作为参数, 使函数按引用接收一般指针?

答:不可以。C中没有一般的指针的指针类型。 void*可以用作一般指针只是因为当它和其它类型相互赋值的时候, 如果需要, 它可以自动转换成其它类型; 但是, 如果试图这样转换所指类型为void*之外的类型void** 指针时, 这个转换不能完成。

6. 我有一个函数 extern int f(int *); 它接受指向 int 型的指针。 我怎用引用方式传入一个常数? 下面这样的调用似乎不行

f(&5);

答:在 C99 中, 你可以使用 “复合常量”:f((int[]){5});在C99之前,你不能直接这样做;你必须先定义一个临时变量,然后把它的地址传给函数:

int five = 5;
f(&five);

7. C有“按引用传递”吗?

答:真的没有。严格地讲,C总是按值传递。你可以自己模拟按引用传递, 定义接受指针的函数,然后在调用时使用 & 操作符。事实上,当你向函数传入数组时,编译器本质上就是在模拟按引用传递。但是 C 没有任何真正等同于正式的按引用传递或 C++ 的引用参数的东西。另一方面, 类似函数的预处理宏可以提供一种“按名称传递”的形式。

8. 我看到了用指针调用函数的不同语法形式。到底怎么回事?

答:最初, 一个函数指针必须用 * 操作符 (和一对额外的括弧) “转换为” 一个 “真正的” 函数才能调用:

int r, func(), (*fp)() = func;
r = (*fp)();

而函数总是通过指针进行调用的, 所有 “真正的” 函数名总是隐式的退化为指针。这个推论表明无论 fp 是函数名和函数的指针r = fp();ANSI C 标准实际上接受后边的解释,这意味着 * 操作符不再需要, 尽管依然允许。

9. 我怎样把一个 int 变量转换为 char * 型? 我试了类型转换, 但是不行

答:这取决于你希望做什么。如果你的类型转换不成功, 你可能是企图把整数转为字符串。如果你试图把整数转换为字符,参考如下:

在 C 语言中字符用它们的字符集值对应的小整数表示。因此, 你不需要任何转换函数,如有你有字符, 你就有它的值。数字字符和它们对应的 0-9 的数字之间相互转换时, 加上或减去常数 ’0, 也就是说,0’ 的字符值。

如果你试图让一个指针指向特定的内存地址,参考如下:

// 设置一个适当类型的指针取正确的值, 使用明示的类型重制, 以保证编译器知道这个不可移植转换是你的意图:

unsigned int *magicloc = (unsigned int *)0x12345678;

那么, *magiloc 就指向你所要的地址。 如果地址是个内存映射设备的寄存器,你大概需要使用限定词 volatile 。 MS-DOS下, 在和段、偏移量打交道时, 你会发现像MK FP这类宏非常好用。

加关公重号Linux兵工厂,获取海量Linux硬核资料,一起学习交流。
在这里插入图片描述

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

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

相关文章

坚果的2022年终总结

人生天地之间,若白驹过隙,转眼间,这一年又快要过去了,按照惯例还是写一篇年终总结,同时也看一下自己是否又成长,是否有哪些事情没做好,给自己做一个复盘。一、缘起OpenHarmony我是从去年开始参加…

Webpack 钩子介绍、手写 Webpack Plugin

目录 1. Plugin 用作和工作原理 1.1 Plugin 的作用 1.2 Plugin 的工作原理 2. Webpack 底层逻辑和钩子介绍 2.1 Webpack 内部执行流程 2.2 Webpack 内部钩子 2.2.1 钩子是什么 2.2.2 Tapable —— 为 Webpack 提供 Plugin 钩子 数据类型接口 定义 2.2.3 Compiler Hook…

C#,图像二值化(08)——灰度图像二值化,全局算法,全局阈值优化算法及其源代码

1、全局阈值算法 基于灰度直方图的优化迭代算法之一。 Iterative Scheduler and Modified Iterative Water-Filling In the downlink, the inter-cell interference is only function of the power levels and is independent of the user scheduling decisions. This suggest…

俺的2022年

年末将至,还是要写点总结性的内容,以回顾过去一年做的各种事情。工作之外从客观数据上看,今年的收入水平略差于去年,主要是工作外的收入有所减少,其核心原因是没有录制新的课程内容进行变现,原本的计划是&a…

【自学Python】Python介绍

Python教程 什么是编程语言 编程语言(programming language),是用来定义计算机程序的形式语言。它是一种被标准化的交流技巧,用来向计算机发出指令。 也可以说,计算机语言让程序员能够准确地定义计算机所需要使用的…

拓展交流空间,分享开发精彩 | 开发者说·DTalk 鉴赏

日月其迈,岁律更新,时间的洗礼让开发者们更加坚韧,持续探索,不断追求,同样也激励着我们为开发者提供更多的帮助与支持。不断迭代的技术产品是开发者们的趁手工具,定期更新的政策助力打造安全可靠的生态&…

基础数学(4)——线性回归复习

文章目录课程回顾基础知识回归模型的建模过程一元线性回归模型线性回顾进行极大似然估计(例题(必考))极大似然估计极大似然估计的性质线性性无偏性最优性(记住即可,没有推导)方差计算一元线性回…

智能制造 | AIRIOT智慧工厂管理解决方案

工厂生产运转中,设备数量多,环境复杂、企业往往需要承担很高的维修、保养、备件和人力成本。传统的工厂改革遇到了诸多前所未有的挑战: 1、管理系统较多,数据隔离,系统集成困难重重; 2、大量老旧设备无法联…

QT使用log4cpp日志库

文章目录QT使用log4cpp日志库1. 从官网下载log4cpp源码2. 编译项目3. 在QT中使用log4cpp4. log4cpp4.1. Category4.2. Appender4.3. Layout4.4. Priority4.5. 使用宏定义为日志加上文件名 函数名 行号等QT使用log4cpp日志库 1. 从官网下载log4cpp源码 log4cpp官方网址 下载后…

MyBatisPlus ---- 常用注解

MyBatisPlus ---- 常用注解1. TableNamea>问题b>通过TableName解决问题c>通过全局配置解决问题2. Tablelda>问题b>通过TableId解决问题c>TableId的value属性d>TableId的type属性e>雪花算法3. TableFielda>情况1b>情况24. TableLogica>逻辑删除…

LeetCodeday03

203.移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5] 示例 2&#xff1…

基于springboot+mybatis+mysql+html实现医院预约挂号管理系统

基于springbootmybatismysqlhtml实现医院预约挂号管理系统一、系统简介二、系统主要功能界面2.1登陆2.2首页(留言板、我的预约)--用户2.3就诊预约--用户2.4我的预约--用户2.5我参与的评介--用户2.6我的预约日程--医生2.7对我的评介--医生2.8医生管理--管…

一文探索“预训练”的奥秘!

Datawhale干货 作者:王奥迪,单位:中国移动云能力中心2022年下半年开始,涌现出一大批“大模型”的优秀应用,其中比较出圈的当属AI作画与ChatGPT,刷爆了各类社交平台,其让人惊艳的效果&#xff0c…

[思维模式-19]:《复盘》-7- “积”篇 - 操作复盘- 如何做好复盘

目录 一、联想:复盘的五个误区与七个关键成功要素 1.1 五个误区 1.2 七个关键成功要素 二、复盘的25个“坑”及对策建议 2.1 回顾、评估阶段 2.2 分析、反思阶段 2.3 萃取、提炼阶段 2.4 转化、应用阶段 2.5 复盘引导阶段 三、有效复盘的三项核心技能 3.…

java常见问题处理

文章目录一、前言二、实战演练1、idea常用快捷键使用2、idea设置字体大小3、idea设置背景颜色-背景4、idea配置Maven5、idea中配置JDK6、idea中java.util变红报错IDEA中Sources、JavaDocs路径是红色的7、idea中使用mybatisPlus 自增主键失效,自增主键超大小知识点8、…

ZI-data RO-data RW-data Code BSS DATA

KEIL MDK 查看代码量、RAM使用情况--RO-data、RW-data、ZI-data的解释(转) - 酒醉的Tiger - 博客园源:KEIL MDK 查看代码量、RAM使用情况--RO-data、RW-data、ZI-data的解释KEIL RVMDK编译后的信息Program Size: Code86496 RO-datahttps://ww…

STM32MP157驱动开发——Linux 音频驱动

STM32MP157驱动开发——Linux 音频驱动一、简介1.CS42L51 简介2.I2S总线3.STM32MP1 SAI 总线接口二、驱动开发1.音频驱动1)修改设备树i2c 接口:1.8v电源管理:2)SAI 音频接口设备树3)sound 节点2.使能和修改内核的 CS42…

linux系统中字符设备驱动开发方法

大家好,今天主要和大家聊一聊,linux系统中的字符设备驱动实现的基本过程。 目录 第一:字符设备驱动简介 第二:字符设备驱动开发步骤 第三:编写字符设备驱动实验程序 第一:字符设备驱动简介 字符设备是Li…

130道基础OJ编程题之: 58 ~ 67 道

130道基础OJ编程题之: 58 ~ 67 道 文章目录130道基础OJ编程题之: 58 ~ 67 道0. 昔日OJ编程题:58. BC61 金字塔图案59. BC62 翻转金字塔图案60. BC63 菱形图案61. BC64 K形图案62. BC65 箭形图案63. BC66 反斜线形图案64. BC67 正斜线形图案65. BC68 X形图案66. BC69 空心正方形…

电商大促话术

每逢节日,各大电商平台为了迎合节日气氛,会有各种大促活动,客户咨询量都会较平日有所增加,为了接待更多的客户,客服要掌握一定的电商大促话术。 前言 每逢节日,各大电商平台为了迎合节日气氛,会…