C语言-指针二三事

【C语言】指针那些事之数组传参和指针传参的区别 该文章详细的讲解都有啥指针,及包括指针的日常使用等等,各位可以愉快的食用该文章的对于指针的理解,可以为大家对指针的理解加深一点。 阅读详情

有同事今天问我一个指针的问题,没深究原因,下班回来静下心来分析分析,写下这篇文章,如有任何疑问请留言.

问题一

要实现一个函数,我们姑且理解成函数内部 malloc申请一块内存,然后针对这块内存做一系列操作,操作这部分姑且不用实现,我们要返回申请的这片内存的地址.

version 1

如果你拿到这个问题就立刻编写代码的话极有可能这么写:

/*
    Name: 二级指针
    Copyright: 52coder.net
    Author: 52coder
    Date: 03/06/17 17:24
    Description: pointer
 */

#include <stdio.h>
#include <stdlib.h>

/*获取malloc内存的地址*/
int getaddress(int *address)
{
    int size = 64;
    address = malloc(size *sizeof(int));
    printf("Address of malloc memory is:%p\n",address);
    return 0;
}
int main()
{
    int *pointer = NULL;
    getaddress(pointer);
    printf("Address of pointer is:%p\n",pointer);
    return 0;
}

那么结果可能比较让人失望:

Address of malloc memory is:0x100500270
Address of pointer is:0x0
Program ended with exit code: 0

pointer 的值居然是0x0,换言之我们没有将所申请内存的地址带出来.

version 2

/*
    Name: 二级指针
    Copyright: 52coder.net
    Author: 52coder
    Date: 03/06/17 17:24
    Description: pointer
 */

#include <stdio.h>
#include <stdlib.h>

/*获取malloc内存的地址*/
int getaddress(int **address)
{
    int * tmp = NULL;
    int size = 64;
    tmp = malloc(size *sizeof(int));
    *address = tmp;
    printf("Address of malloc memory is:%p\n",tmp);
    return 0;
}
int main()
{
    int *pointer = NULL;
    getaddress(&pointer);
    printf("Address of pointer is:%p\n",pointer);
    return 0;
}

输出结果终于符合我们预期:
Address of malloc memory is:0x100202350
Address of pointer is:0x100202350
Program ended with exit code: 0

pointer的值就是我们在函数中所申请的内存地址.
那么写道这里你是否会有疑问,函数getaddress中是否真正需要tmp中间变量呢?

version 3

/*
    Name: 二级指针
    Copyright: 52coder.net
    Author: 52coder
    Date: 03/06/17 17:24
    Description: pointer
 */

#include <stdio.h>
#include <stdlib.h>

/*获取malloc内存的地址*/
int getaddress(int **address)
{
    int size = 64;
    *address = malloc(size *sizeof(int));
    printf("Address of malloc memory is:%p\n",address);
    return 0;
}
int main()
{
    int *pointer = NULL;
    getaddress(&pointer);
    printf("Address of pointer is:%p\n",pointer);
    return 0;
}

运行结果居然是:
Address of malloc memory is:0x7fff5fbff7b0
Address of pointer is:0x100300000
Program ended with exit code: 0
那么为什么会是这样呢?
问题原因很简单,就是在函数getaddress中我们打印*address才是申请内存的地址.

问题二

这个同样是一道考验指针的问题,大致要实现如下内容,结构体中包含二级指针,通过二级指针 一级指针都可以访问新申请的内存.

/*
    Name: 二级指针
    Copyright: 52coder.net
    Author: 52coder
    Date: 03/06/17 17:24
    Description: pointer
 */

#include <stdio.h>
#include <stdlib.h>

typedef struct student
{
    int age;
    int height;
}stu;

typedef struct school
{
    int num;
    stu **boys;
}grade;

int main()
{
    int i = 0;
    stu *tmp = NULL;
    grade oneclass;

    //定义班级男生个数
    oneclass.num = 55;

    grade *one = &oneclass;

    //申请内存
    tmp = malloc(oneclass.num * sizeof(stu));

    one->boys = &tmp;

    //打印三种操作方法对应的地址
    for (i = 0; i < 55; i++)
    {
        printf("tmp + i =%p &tmp[i] = %p *one->boys+i =%p\n",
                tmp+i, &tmp[i], *(one->boys)+i);
    }

    //设置55个元素的age
    for (i=0; i<55; i++)
    {
        tmp[i].age = i;
    }
    //设置55个元素的height
    for (i=0; i<55; i++)
    {
        tmp[i].height = 55-i;
    }

    for (i=0; i<55; i++)
    {
        printf("%d ", (*(one->boys))[i].age);
    }

    for (i=0; i<55; i++)
    {
        printf("%d ", (*one->boys)[i].height);
    }

    return 0;
}

下面代码是一段验证程序

/*
    Name: 二级指针
    Copyright: 52coder.net
    Author: 52coder
    Date: 03/06/17 17:24
    Description: pointer
*/

#include <stdio.h>
#include <stdlib.h>

typedef struct student
{
    int age;
    int height;
}stu;

typedef struct school
{
    int num;
    stu **boys;
}grade;

int main()
{
    int i = 0;
    stu *tmp = NULL;
    grade oneclass;

    //定义班级男生个数
    oneclass.num = 55;

    grade *one = &oneclass;

    //申请内存
    tmp = malloc(oneclass.num * sizeof(stu));

    one->boys = &tmp;

    printf("\n");

    //验证地址与值的关系
    printf("&tmp = %p,one->boys = %p\n",&tmp,one->boys);
    printf("tmp = %p,*(one->boys) = %p\n",tmp,*(one->boys));
    printf("tmp + 10 = %p,*(one->boys) + 10 = %p\n",tmp+10,*(one->boys)+10);

    return 0;
}
uniapp - 使用 <video> 播放视频黑屏,浏览器控制台报错: DOMException: The element has on supported sources.(详细完美解决方案) uniapp video 视频播放黑屏,uniapp 报错DOMException: The element has on supported sources.,uniapp如何解决DOMException: The element has on supported sources.,uniapp使用video标签无法播放视频出现黑屏问题处理,uniapp解决video视频黑屏显示0秒,并且浏览器报错DOMException: The element has on supported sources.,un 阅读详情

相关推荐

llama factory

NOTE] 除上述链接以外的其他网站均为未经许可的第三方网站,请小心甄别。

thesky123456的博客 1273

C语言——指针

C语言——指针

weixin_59796310的博客 11万+

ANSYS拓扑优化基础实例

唐深51CAE 2018/6/10 拓扑优化在工程设计中,常用于机械结构概念设计和轻量化设计,ANSYS通用有限元分析软件提供了强大的拓扑优化功能,本文将通过一个简单实例进行展示。 一、赵州桥 赵州桥又称安济桥,坐落在河北省赵县洨河上,建于隋朝年间公元595年~605年,由著名匠师李春设计建造,距今已有约1500年的历史,是当今世界上现存最早、保存最完整的古代敞...

TQT_CAE的博客 6026

死磕C语言指针

兜兜转转还是逃不过 C 语言,这该死的缘分。 先看一眼我的西野七濑 学习自:https://zhuanlan.zhihu.com/p/89121683 目录 1 指针 1.1 指针是乜嘢 1.2 指针的声明 1.3 运算符 1.4简单的小例子们: 例子1 例子2:指针在函数间通信 1.5 指针的运算 1.5.1 指针加减运算 1.5.2 间址运算 1.5.3 指...

闲狗的博客 2万+

手把手教你用AI工具快速开发UniApp首页:从设计稿到完整页面的实战流程

本文详细介绍了如何利用Claude Code、Cursor等AI工具高效开发UniApp首页的完整工作流。从设计稿解析、Prompt工程、代码生成优化到调试适配,提供了一套可复用的实战流程,帮助前端开发者大幅提升从设计到代码的转化效率。

weixin_29199873的博客 317

上汽CPMP开发流程与A、B、C、D样

也叫验收样件或设计样件,是根据A样试制结果优化后的样件,外观、功能达到设计要求,B样可以是手工样件或者模具件,B样件的全维度产品功能和尺寸参数已经固化下来,并需要和最终的量产产品保持一致。为批量样件或生产样件、展示样件,是在A/B的基础上完善结果,此时的产品状态已经完全定型,并能够满足客户和市场提出的各类需求。预试生产(Pre-Production)----------------------------------------------------------------------→D样。

weixin_43602865的博客 3707

【C中二三事】指针专题

在 C 中,指针概念一直处于不佳而或缺的地位,本文就指针这一主题,记录下C语言在指针编程中的小细节。

AlanKSorata的博客 1027

【AI理论学习】深入理解扩散模型:Diffusion Models(DDPM)(理论篇)

继OpenAI在2021提出的文本转图像模型之后,越来越多的大公司卷入这个方向,例如谷歌相继推出了和。一些主流的文本转图像模型,例如,和采用了扩散模型()作为图像生成模型,这也引发了对扩散模型的研究热潮。与GAN相比,扩散模型训练更稳定,而且能够生成更多样的样本,OpenAI的论文也证明了

小哲的博客 5212

c语言—指针详解

文章目录一、指针是什么二、指针和指针变量1.左值与右值2.两者的区别1.指针2.指针变量3.如何使用三、指针和指针类型 一、指针是什么 指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。 指针就是地址,地址就是指针。 使用指针的目的是提高使用效率 二、指

Welcome to my blog. 2万+

LVGL colorwheel组件教程一(调色板)

【代码】LVGL colorwheel组件教程一(调色板)

摸鱼专家 427

轴承寿命预测 | 基于BiLSTM双向长短期记忆神经网络的轴承寿命预测附matlab完整代码

轴承寿命预测 | 基于BiLSTM双向长短期记忆神经网络的轴承寿命预测附matlab完整代码

默默科研仔的博客 273

C语言之指针那些事(1)

谈到指针,我们第一印象就是难,但是在C语言中指针却是很重要的一部分,所以我们得打好基础。在这部分我将会详细讲解指针,大家认真做好小笔记,学习起来简直易如反掌(bushi好啦,话不多说,搬好小板凳开始学习吧!

2401_83871176的博客 1883

华为OD机考2025C卷 - 高矮个子排队(Java & Python& JS & C++ & C)

华为OD机考2025C卷 - 高矮个子排队。提供在线OJ刷题。Java、C++、Python、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 1680

指针c语言有什么作用,c语言中指针有什么用?

一、什么是指针C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址。CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位。这里,数据对象是指存储在内存中的一个指定数据类型的数值或字符串,它们都有一个自己的地址,而指针便是保存这个地址的变量。也就是说:指针是一种保存变量地址的变量。前面已经提到内存其实就是一组有序字节组成的数组,数组中,每个字节大大...

weixin_42515781的博客 9105

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C语言——指针那些事

简单通俗的语言讲清指针

天上的光博客 977

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Go语言才是学习指针的安全之地,关于指针的二三事

本章学习目标 学会声明和使用指针 理解指针和随机访问存储器(RAM)之间的关系 了解指针的使用时机 当我们在街上散步的时候,常常会看到一些用于指引方位的地址和街道标识。你可能曾经遇到过这样一种情况,一家大门紧闭的商店在它的橱窗上贴出了道歉标语“抱歉,本店已乔迁新址!”,并在标语的下方给出新的地址。指针就有点儿像这个给出新地址的标语,它会把你指引至不同的地址。 指针是指向另一变量的地址的...

人邮异步社区 851

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C语言的指针

指针(pointer)是C语言最重要的(有时也是最复杂的)概念之一,是一个值为内存地址的变量,用于存储变量的地址。指针的第一个基本用法就是在函数间传递信息。概括地的说,如果主调函数不使用return返回的值,则必须通过地址才能改变主调函数(Main函数)中的变量值。

把酒送清风的博客 3464

c语言指针是什么

计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 4 个字节,char 占用 1 个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。 下图是 4G 内存中每个字节的编号(以十六进制表示): 我们将内存中字节的编号称为地址(Address)或指针(Pointer)。地址从 0 开始依次增加,对于 32 位环境,程序能够使用的内存为 4GB,最小的地址为 0,最大的地址为 0XFFF

顺其自然~专栏 4818

【C语言指针的哪些事】

在执行效率上,C语言中的指针操作通常比Python中的数组索引更高,因为C语言直接操作内存地址,没有额外的类型检查和内存管理开销。在C语言中,数组索引功能是通过数组下标和指针运算实现的,这种实现方式非常高效。机器代码是计算机CPU可以直接执行的二进制指令集,编译器的主要任务是将高级语言编写的源代码转换为机器代码。这个过程包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成。生成的机器代码直接对应于CPU的指令集和寄存器操作,是计算机程序的最低级别表示。

帮助100万人颠覆负面潜意识,实现人生蜕变,培养1万名潜意识开发导师 1237

【C语言进阶】C语言指针的高阶用法

相信大家当初学习C语言的时候,老师一定跟你说过这样的一句大实话:【指针,是C语言的灵魂】。

一个专注于嵌入式IoT领域的架构师,深耕IoT领域多年,深度掌握IoT领域的相关技术栈,包括但不限于RTOS内核的实现及其移植、硬件驱动移植开发、网络通讯协议开发、编译构建原理及其实现、底层汇编及编译原理、编译优化及代码重构、嵌入式IoT系统的架构设计等。 9294

【C语言】指针

C语言中的指针是一种特殊的变量,它存储的是另一个变量的内存地址。

小明的博客 1517

C语言——初始指针

文章目录C语言——初始指针指针是什么指针和指针类型野指针指针运算 C语言——初始指针 指针 本章重点 1.指针是什么 2.指针和指针类型 3.野指针 4.指针运算 5.指针和数组 6.二级指针 7.指针数组 指针是什么 在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向变量单元。因此,将地址形象化的成为指针。意思是通过它能找到以他为地址的内存单元。 我们可以这样理解: 内存:

qq_59702185的博客 3646

c 语言输出指针的值,C 语言指针

C 语言指针在本教程中,您将学习指针。什么是指针,如何使用它们以及在示例的帮助下使用它们时可能遇到的常见错误。指针是 C和C ++ 编程的强大功能。在学习指针之前,让我们学习一下C语言编程中的地址。C 语言地址如果程序中有变量var,则&var将在内存中提供其地址。使用scanf()函数时,我们已多次使用地址。scanf("%d",&var);在此,用户输入的值存储在var变量的地址中。...

weixin_39587113的博客 8020

指针二三事

C语言中最棘手问题的当属指针了,不过这也是C的精华所在。 指针是一种数据类型,区别在于指针类型的值是一个内存地址。32位机器上,指针变量占用四个字节。往往你觉得你把指针弄的很透彻了,但你还是会做错题目,或许因为粗心,或许自己混淆了,总之指针问题真的很绕。最近笔者在看「程序员求职成功之路」,书中伊始讲的就是C语言指针,看完之后获益匪浅,特在此总结一下。 1.先看一道经典的指针题...

162

C语言指针讲解

前言 指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。作为一个C语言初学者,我对指针也有了一定的了解,正好这几天在做一个C语言指针的知识点汇总,于是就有了这篇文章,向大家分享一些我的见解,与大家一起共勉。 为什么要学习指针 如果你想通过函数改变一个变量的值,就得用指针而不能用值传递,很多时候不同的函数存在很多不同的变量,当程序的数据量十分庞大的时候,我们就需要用指针来作为形参,通过传递地址,达到传递变量的目的。 指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量

WZRbeliever的博客 2284

c语言void*指针,C语言void指针

C语言void指针教程在 void 的意思就是 “无类型”,void 指针则为 “无类型指针”,void 指针可以指向void指针使用在 C 语言中在任何时候都可以用 void 类型的指针来代替其他类型的指针,void 指针可以指向任何数据类型的变量。如果要通过 void 指针去获取它所指向的变量值时候,需要先将 void 指针强制类型转换成和变量名类型相匹配的数据类型指针后再进行操作。任何类型的...

weixin_27743991的博客 2817
上一篇: C语言实现进度条
下一篇: 100个GDB小技巧(一)
52coder
博客等级 码龄17年 87粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值