C 中的指针 - 结构和指向指针的指针

0. 结构体指针

与整数指针、数组指针和函数指针一样,我们也有结构体指针或结构体指针。

struct records {char name[20];int roll;int marks[5];char gender;
};struct records student = {"Alex", 43, {76, 98, 68, 87, 93}, 'M'};struct records *ptrStudent = &student;

在这里,我们声明了一个ptrStudent类型为 的指针struct recordsstudent我们已将的地址分配给ptrStudent

ptrStudent存储 的基地址student,它是结构体第一个成员的基地址。增加 1 将使地址增加sizeof(student)字节。

printf("Address of structure = %d\n", ptrStudent);
printf("Adress of member `name` = %d\n", &student.name);
printf("Increment by 1 results in %d\n", ptrStudent + 1);/* Output */
Address of structure = 6421984
Adress of member `name` = 6421984
Increment by 1 results in 6422032

我们可以通过两种方式访问student​​using的成员。ptrStudent使用我们的老朋友*或使用->中缀或箭头运算符)。

对于*,我们将继续使用.( 点运算符),而对于 ,->我们将不需要点运算符。

printf("Name w.o using ptrStudent : %s\n", student.name);
printf("Name using ptrStudent and * : %s\n", ( *ptrStudent).name);
printf("Name using ptrStudent and -> : %s\n", ptrStudent->name);/* Output */
Name without using ptrStudent: Alex
Name using ptrStudent and *: Alex
Name using ptrStudent and ->: Alex

同样,我们也可以访问和修改其他成员。请注意,使用时括号是必需的,*因为点运算符 ( .) 的优先级高于*

1. 结构体数组

我们可以创建一个类型数组struct records并使用指针来访问元素及其成员。

struct records students[10];/* Pointer to the first element ( structure) of the array */
struct records *ptrStudents1 = &students;/* Pointer to an array of 10 struct records */
struct records (*ptrStudents2)[10] = &students;

请注意,ptrStudent1是 一个指向student[0]while的指针,而ptrStudent2是一个指向整个数组 10 的指针struct records。加 1 将ptrStudent1指向student[1]

我们可以使用ptrStudent1循环来遍历元素及其成员。

for( int i = 0; i <  10; i++)
printf("%s, %d\n", ( ptrStudents1 + i)->name, ( ptrStudents1 + i)->roll);

2. 将结构指针作为参数

我们还可以将结构变量的地址传递给函数。

#include <stdio.h>struct records {char name[20];int roll;int marks[5];char gender;
};main(){struct records students = {"Alex", 43, {76, 98, 68, 87, 93}, 
'M'};printRecords(&students);
}void printRecords( struct records *ptr){printf("Name: %s\n", ptr->name);printf("Roll: %d\n", ptr->roll);printf("Gender: %c\n", ptr->gender);for( int i = 0; i < 5; i++)printf("Marks in %dth subject: %d\n", i, ptr->marks[i]);
}/* Output */
Name: Alex
Roll: 43
Gender: M
Marks in 0th subject: 76
Marks in 1th subject: 98
Marks in 2th subject: 68
Marks in 3th subject: 87
Marks in 4th subject: 93

请注意,该结构struct records是在外部声明的main()。这是为了确保它在全球范围内可用并且printRecords()可以使用。

如果该结构体在内部定义main(),其范围将被限制为main(). 此外,结构体也必须在函数声明之前声明。

与结构一样,我们可以拥有指向联合的指针,并且可以使用箭头运算符 ( ->) 访问成员。

3. 指针到指针

到目前为止,我们已经了解了指向各种原始数据类型、数组、字符串、函数、结构和联合的指针。

我自然而然地想到的问题是——指针到指针怎么样?

好消息给你!他们也存在。

int var = 6;
int *ptr_var = &var;printf("Address of var = %d\n", ptr_var);
printf("Address of ptr_var = %d\n", &ptr_var);/* Output */
Address of var = 6422036
Address of ptr_var = 6422024

int为了存储变量的地址var,我们有一个指向 的指针int ptr_var。我们需要另一个指针来存储 的地址ptr_var

由于ptr_var是 类型int *,为了存储其地址,我们必须创建一个指向 的指针int *。下面的代码展示了如何做到这一点。

int * *ptr_ptrvar = &ptr_var; /* or int* *ppvar or int **ppvar */

我们可以使用ptr_ptrvar来访问 的地址ptr_var,并使用双重解引用来访问 var。

printf("Address of ptr_var = %d\n", ptr_ptrvar);
printf("Address of var = %d\n", *ptr_ptrvar);
printf("Value at var = %d\n", *(*ptr_ptrvar));/* Output */
Address of ptr_var = 6422024
Address of var = 6422036
Value at var = 6

取消引用时不需要使用括号ptr_ptrvar。但使用它们是一个很好的做法。我们可以创建另一个指针ptr_ptrptrvar,它将存储 的地址ptr_ptrvar

由于ptr_ptrvar是 类型int**,因此声明ptr_ptrptrvar

int** *ptr_ptrptrvar = &ptr_ptrvar;

我们可以再次访问ptr_ptrvarptr_var使用。varptr_ptrptrvar

printf("Address of ptr_ptrvar = %d\n", ptr_ptrptrvar);
printf("Value at ptr_ptrvar = %d\n",*ptr_ptrptrvar);
printf("Address of ptr_var = %d\n", *ptr_ptrptrvar);
printf("Value at ptr_var = %d\n", *(*ptr_ptrptrvar));
printf("Address of var = %d\n", *(*ptr_ptrptrvar));
printf("Value at var = %d\n", *(*(*ptr_ptrptrvar)));/* Output */
Address of ptr_ptrvar = 6422016
Value at ptr_ptrvar = 6422024
Address of ptr_var = 6422024
Value at ptr_var = 6422036
Address of var = 6422036
Value at var = 6

ptr_ptrptrvar如果我们使用或更改任何指针的值ptr_ptrvar,则指针将停止指向该变量。


我尝试尽可能多地介绍指针。我们讨论了指针表示法、定义、类型和算术。接下来是它在数组、字符串和函数中的使用。最后,我们讨论了结构体和指针本身!一个完整的圆,不是吗?

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

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

相关文章

A start job is running for Hold unt…s up (1d 18h 52min 25s / no limit) 如何去掉

在host串口里一直出现打印 A start job is running for Hold unt…s up (1d 18h 52min 25s / no limit) 这个是有一个进程一直在执行中&#xff0c;那么是什么呢&#xff1f;因为我的host通过SSH连接后就可以进入host shell界面了。那这个线程是什么程序导致的呢&#xff1f; …

Linux socket编程(7):I/O系统调用(读/写/连接)的超时处理

在网络编程中&#xff0c;对套接字的I/O的系统调用(如read,write,connect)进行超时处理是至关重要的&#xff0c;特别是在需要响应及时的实时数据或避免无限期阻塞的情境下。本文将深入介绍处理套接字I/O超时的两种方法&#xff1a;setsockopt和select。setsockopt允许直接设置…

小程序域名SSL证书的重要性

1. 数据安全 小程序中可能涉及用户的个人信息、支付信息等敏感数据&#xff0c;而未加密的通信容易受到中间人攻击。通过使用SSL证书&#xff0c;所有数据在传输过程中都会被加密&#xff0c;确保用户信息不被窃取或篡改。 2. 用户信任 浏览器和操作系统对使用SSL证书的网站…

索引出错问题。为什么建立了索引,也避免了索引失效问题,还是会出现查询不走索引的情况?

什么建立了索引&#xff0c;也避免了索引失效问题&#xff0c;还是会出现查询不走索引的情况&#xff1f; 其实这个问题在于CBO&#xff08;Cost-based Optimizer&#xff09;&#xff0c;优化器是很强大的&#xff01;他根据开销来决定是否要用索引以及用哪个索引&#xff01;…

Spring-SpringFramework特性以及IOC相关知识

SpringFramework五大模块 特性 IOC思想和DI IOC是容器&#xff0c;用于管理资源 IOC&#xff1a;Inversion of Control 反转控制 DI&#xff1a;Dependecy Injection 依赖注入 组件以预先定义好的方式接受来自容器的资源注入 IOC在Spring中的实现 spring提供两种方式&…

图书管理系统源码,图书管理系统开发,图书借阅系统源码四TuShuManager应用程序MVC视图View

Asp.net web应用程序MVC之View视图 .ASP.NET MVC页面也就是要说的视图基本被放在Views文件夹下&#xff1b; 2.利用APS.NET MVC模板生成框架&#xff0c;Views文件夹下的默认页面为.cshtml页面&#xff1b; 3.ASP.NET MVC默认页面为Razor格式的页面&#xff0c;因此默认页面为.…

NX二次开发UF_CURVE_ask_wrap_curves 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_wrap_curves Defined in: uf_curve.h int UF_CURVE_ask_wrap_curves(tag_t wrap_curve_object, int * num_output_curves, tag_t * * output_curves ) overview 概述 …

了解静态测试?

静态测试是一种软件测试方法&#xff0c;它主要通过分析软件或代码的静态属性来检查潜在的问题和缺陷&#xff0c;而无需实际执行程序。这种测试方法侧重于检查源代码和其他软件文档&#xff0c;以发现错误并提高软件质量。 为什么要做静态测试&#xff1f; 提前发现和修复错…

[操作系统]京东一面~进程相关汇总

1 进程、线程、协程的概念 进程&#xff1a; 静态程序的运行状态就叫进程。是资源分配的基本单位。 线程&#xff1a; 是进程的一个执行单元&#xff0c;是进程内的调度实体。是CPU调度的独立单位。线程也被称为轻量级进程。 协程&#xff1a; 是一种比线程更加轻量级的存在。…

vue3安装eslint和prettier,最简单的步骤

第1步&#xff1a; 安装eslint yarn add eslint -D 第2步&#xff1a; 在根文件夹中&#xff0c;创建.eslintrc.js文件 第3步&#xff1a; 在package.json文件中新增命令 "lint": "eslint --fix --ext .ts,.tsx,.vue src --quiet","prettier"…

红米手机如何远程控制荣耀手机?

很多人都知道&#xff0c;华为体系有【畅联】&#xff0c;与华为手机或平板“畅连”通话时&#xff0c;可共享屏幕给对方&#xff0c;一边聊天一边演示&#xff0c;还可在屏幕上涂鸦帮助理解。同样&#xff0c;小米体系有【小米通话】&#xff0c;它的远程协助功能可以帮助朋友…

蓝桥杯第100 题 九宫幻方 DFS 全排列 C++ 解题思维

题目 九宫幻方https://www.lanqiao.cn/problems/100/learning/?page1&first_category_id1&name%E4%B9%9D 思路和解题方法 一 &#xff08;DFS) 首先&#xff0c;定义了一些全局变量和数组。vis数组用于标记已经出现过的数字&#xff0c;a数组用于存储数独的初始状态…

mac上Homebrew的安装与使用

打开终端&#xff1a;command空格 &#xff0c;搜索‘’终端 ’&#xff0c;打开终端 在终端中输入以下命令并按下回车键&#xff1a; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"这个命令会自动下载并安装…

Ubuntu18.04磁盘取证-中难度篇

涉及的镜像文件&#xff1a; sdb.vhd uac.tar ubuntu.20211208.mem 需要利用的工具&#xff1a; volatility3 volatility2.6.1 FTK/Autopsy Strings 题干 容器是一个Ubuntu Linux 蜜罐&#xff0c;用来观察利用 CVE-2021-41773 的漏洞攻击者想要做什么。 您将看到一个 cr…

【c++】多线程大幅缩减时间

多线程在进行复杂运算时能够大量节约时间 提醒自己能够在多线程运算的时候一定要充分利用 能够省下2/3的时间 测试代码 #include<vector> #include <iostream> #include <thread> using namespace cv; using namespace std; int result1 0 ; bool thread…

【TiDB】TiDB离线方式部署

目录 1 下载TiDB离线组件包 2 安装TiUP 3 合并离线包 4 TIDB 软件和硬件环境建议配置 5 TiDB环境与系统配置检查 6 生成集群初始化配置文件模板 7 执行部署命令 1 检查就能存在的潜在风险 2 手动修复风险 3 部署 TiDB 集群 8 查看TIUP管理的集群情况 9 检查部署的…

【jupyter notebook中插件 nbextensions 安装失败分析与解决方法】

文章目录 问题描述分析与解决总结 问题描述 一开始在安装 notebook 中的插件 nbextensions 时根本没有注意到版本的适配问题&#xff0c;都是进行默认的安装&#xff0c;结果安装是最新版本的 notebook7.x&#xff0c;恰好 notebook7.x 版本不再适应插件 nbextensions&#xf…

Java八股文面试全套真题【含答案】- SpringMVC篇

以下是一些关于Spring MVC语言的经典面试题以及它们的答案&#xff1a; 什么是Spring MVC框架&#xff1f;它的特点是什么&#xff1f; Spring MVC是基于Java的一种Web应用框架&#xff0c;用于开发基于MVC&#xff08;模型-视图-控制器&#xff09;模式的Web应用程序。它的特…

Oracle 内置sql函数大全

F.1字符函数——返回字符值 这些函数全都接收的是字符族类型的参数(CHR除外)并且返回字符值.除了特别说明的之外,这些函数大部分返回VARCHAR2类型的数值.字符函数的返回类型所受的限制和基本数据库类型所受的限制是相同的,比如: VARCHAR2数值被限制为2000字符(ORACLE 8中为400…

Kafka介绍(一)

什么是kafka Apache Kafka 是一个开源分布式事件流平台&#xff08;通俗点说其实就是一个类似中介的东西&#xff0c;房东将信息放入中介&#xff0c;客户咨询中介或者中介推送信息给咨询过的客户&#xff0c;获取消息&#xff09;&#xff0c;它的核心能力有&#xff0c;高吞吐…