关于指针在结构体中的调用

2024-06-06 06:08
文章标签 指针 调用 结构 体中

本文主要是介绍关于指针在结构体中的调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在学习《数据结构》编程时遇到一些问题,是关于C语言指针的。

这里就没有必要上传整个工程源码了,而只将问题本质总结如下:(若有问题还请各位指正)

typedef struct
{int dat;int *ptr;
}Sample;Sample	temp;printf("%d\n",&temp.dat);	//输出temp.dat的地址
printf("%d\n",&temp.ptr);	//输出temp.ptr的地址
printf("%d\n",temp.dat);	//输出temp.dat中存放的数值,该数值就是一个普通数值。
printf("%d\n",temp.ptr);	//输出temp.ptr中存放的数值,该数值也是一个地址,但是是默认分配的地址,未被初始化。

执行结果如下:

 

下面开始分析。

为便于分析,可将上述执行结果总结在下表中:

&temp.dat1245020

temp.dat-858993460

&temp.ptr1245024

temp.ptr-858993460

 

下面两条语句都不正确:

printf("%d\n",*temp.dat); //非法的,因为dat并非指针变量
printf("%d\n",*temp.ptr); //编译无错,但是执行时会出错,因为此时指针ptr没有被初始化,它不指向任何内存,temp.ptr中存放的是默认的数值-858993460。而*temp.ptr是取指针变量所指存储空间的内容,暂时就认为-858993460
所指存储空间并不存在或者该存储空间的内容不可取,具体原因也许哪一天会通过别的渠道得知。

 

若执行下面两条语句:

 scanf("%d",&temp.dat);
 scanf("%d",&temp.ptr);

比如说执行时输入1和2,则上表变内容变成如下所示:

&temp.dat1245020

temp.dat1

&temp.ptr1245024

temp.ptr2

若此时再执行下面四条语句:

printf("%d\n",&temp.dat); //输出temp.dat的地址,当然还是1245020

printf("%d\n",&temp.ptr); //输出temp.ptr的地址,当然还是1245024

printf("%d\n",temp.dat); //输出temp.dat中存放的数值1,该数值就是一个普通数值

printf("%d\n",temp.ptr); //输出temp.ptr中存放的数值2,该数值是一个地址,即地址单元为2存储空间。

地址为2的存储单元一般是不可写也不可读的。

比如在执行语句scanf("%d",temp.ptr)和语句printf("%d\n",*temp.ptr)时都是错误的,但当temp.ptr指向了确定的存储空间时,这两条语句便是正确的了。

 

若执行语句 temp.ptr = (int *)malloc(sizeof(int)) 后,再执行scanf("%d",temp.ptr)和printf("%d\n",*temp.ptr),就是可以的了,因为此时temp.ptr执向一个确定的存储空间,该存储空间是由malloc函数分配的。

 

上面所有的分析都是基于定义了Sample temp,即定义了Sample类型的变量temp,倘若要是定义Sample类型的指针变量*temp呢?

若定义的是Sample类型的指针变量*temp,则也要对其初始化,使其指向一个确定的存储空间,否则temp自己都不指向确定的存储空间,更别说temp下的dat和ptr了。

初始化方式如下(也可叫作分配存储空间):

temp = (Sample *)malloc(sizeof(Sample));

在初始化后,便可操作temp结构了,但要注意此时的temp.ptr并没有初始化,它并没有指向任何确定的存储空间,temp.ptr的初始化方式在前面已经说了。

在初始化temp之后,后面的操作与上文类似。

这篇关于关于指针在结构体中的调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1035288

相关文章

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

python如何调用java的jar包

《python如何调用java的jar包》这篇文章主要为大家详细介绍了python如何调用java的jar包,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录一、安装包二、使用步骤三、代码演示四、自己写一个jar包五、打包步骤六、方法补充一、安装包pip3 install

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现