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

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

相关文章

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。

C和指针:字符串

字符串、字符和字节 字符串基础 字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。 字符串长度就是字符串中字符数。 size_t strlen( char const *string ); string为指针常量(const修饰string),指向的string是常量不能修改。size_t是无符号数,定义在stddef.h。 #include <stddef.h>

C语言程序设计(选择结构程序设计)

一、关系运算符和关系表达式 1.1关系运算符及其优先次序 ①<(小于) ②<=(小于或等于) ③>(大于) ④>=(大于或等于 ) ⑤==(等于) ⑥!=(不等于) 说明: 前4个优先级相同,后2个优先级相同,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符 1.2关系表达式 用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符