当前位置: 首页 > news >正文

c_指针

文章目录

  • *(p+1)+1表示第 1 行第 1 个元素的地址。如何理解呢?
  • 下标运算符的规则
  • 括号


int a;              // 1.一个整数
int *a;             // 2.一个指向整数的指针
int **a;            // 3.一个指向指针的指针, 它所指向的指针又指向一个整数型数据 ;一个指向 整数的指针 的指针
int a[7];           // 4.包含7个整数型数据的数组; 数组的语义就是一次性定义多个元素;
int *a[7];          // 5.包含7个指针的数组, 这些指针指向整数型数据;([]的优先级高于*,所以a先和[]结合,然后它就变成数组了,接着与 * 结合,变成指针。所以说 int *a[] 是一次性定义多个指针)
int (*a)[7];        // 6.一个指针, 它指向包含7个整数型数据的数组; 也就是说它指向的宽度为7
int (*a)(int a);    // 7.一个指向函数的指针, 该函数有一个整型形参,并返回一个整型数据; 一个指向 有一个整型形参,并返回一个整型数据函数 的指针
int (*a[7])(int);   // 8.包含7个指针的数组, 该指针指向一个函数, 该函数有一个整型形参,并返回一个整型数据
#include <stdio.h>
int main(){int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };int (*p)[4] = a;printf("%d\n", sizeof(*(p+1)));return 0;
}
  • *(p+1) 表示取地址上的数据,也就是整个第 1 行数据。注意是一行数据,是多个数据,不是第 1 行中的第 0 个元素,下面的运行结果有力地证明了这一点:
  • 运行结果为下面所示:

16

*(p+1)+1表示第 1 行第 1 个元素的地址。如何理解呢?

  • *(p+1)单独使用时表示的是第 1 行数据,放在表达式中会被转换为第 1 行数据的首地址,也就是第 1 行第 0 个元素的地址,因为使用整行数据没有实际的含义;
  • 编译器遇到这种情况都会转换为指向该行第 0 个元素的指针
  • 就像一维数组的名字,在定义时或者和 sizeof& 一起使用时才表示整个数组,出现在表达式中就会被转换为指向数组第 0 个元素的指针;

下标运算符的规则

  • (*arrPtr)[i] 等同于 *((*arrPtr)+i) ;
  • 也就是说 下标一次表示 在 指定的地址宽度上移动下标指定的次数,并解地址/(取值);

括号

int *(p1[10]); // 指针数组,可以去掉括号直接写作 int *p1[5];
int (*p2)[10]; // 维数组指针,不能去掉括号
  • 这里需要明白一个符号之间的优先级问题。

  • “[]”的优先级比“*”要高。p1 先与“[]”结合,构成一个数组的定义,数组名为 p1,int * 修饰的是数组的内容,即数组的每个元素。那现在我们清楚,这是一个数组,其包含 10 个指向 int 类型数据的指针,即指针数组。


  • 至于 p2 ,在这里“()”的优先级比 “[]”高,“*”号和 p2 构成一个指针的定义,指针变量名为 p2;

  • int 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。那现在我们清楚 p2 是一个指针,它指向一个包含 10 个 int 类型数据的数组,即数组指针。

  • 这里有个有意思的话题值得探讨一下:平时我们定义指针不都是在数据类型后面加上指针变量名么?这个指针 p2 的定义怎么不是按照这个语法来定义的呢?也许我们应该这样来定义 p2:int (*)[10] p2; (我就很喜欢这样理解),int (*)[10] 是指针类型,p2 是指针变量。

  • 这样看起来的确不错,不过就是样子有些别扭。其实数组指针的原型确实就是这样子的,只不过为了方便与好看把指针变量 p2 前移了而已。你私下完全可以这么理解这点。虽然编译器不这么想。

  • 参考

http://c.biancheng.net/view/368.html

https://blog.csdn.net/lirendada/article/details/122931987

相关文章:

c_指针

文章目录 *(p1)1表示第 1 行第 1 个元素的地址。如何理解呢&#xff1f;下标运算符的规则括号 int a; // 1.一个整数 int *a; // 2.一个指向整数的指针 int **a; // 3.一个指向指针的指针, 它所指向的指针又指向一个整数型数据 ;一个指向 …...

循环队列c语言版

一、循环队列结构体 typedef int QueueDataType; #define CQ_MAX_SIZE 10typedef struct CircularQueue {QueueDataType data[CQ_MAX_SIZE];/**标记队列首*/QueueDataType head;/**标记队列尾部*/QueueDataType rear;} CircularQueue; 二、循环队列操作函数声明 /**创建队…...

SprringMVC拦截器

1、拦截器的配置 SpringMVC中的拦截器用于拦截控制器方法的执行 SpringMVC中的拦截器需要实现HandlerInterceptor SpringMVC的拦截器必须在SpringMVC的配置文件中进行配置&#xff1a; <bean class"com.test.interceptor.FirstInterceptor"></bean> …...

redis的实际使用

Redis是一种内存数据库&#xff0c;常用于缓存、会话管理、消息队列等。在项目中合理使用Redis可以提高系统性能和可扩展性。以下是一些使用Redis的建议&#xff1a; 1. 缓存常用数据&#xff1a;将经常使用的数据缓存在Redis中&#xff0c;以减少数据库的读取次数&#xff0c…...

造车先做三蹦子-之二:自制数据集(5x5数据集)230102

#Jupyter Notebook231001import torch import torch.nn as nn import torch.optim as optim# 定义模型 class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.fc1 = nn.Linear(25, 50)self.fc2 = nn.Linear(50, 6)def forward(self, x):x = x.view(-1, 25…...

JS操作DOM及CSS

JS创造于1994年&#xff0c;其目的是为浏览器显示的文档赋予动态行为。 1 Web编程基础 本节讲解如何编写Web应用中的js程序&#xff0c;如果将这些程序加载到浏览器&#xff0c;以及如何获取输入、产出输出&#xff0c;如何运行响应事件的异步代码。 1.1 js 脚本 虽然现在不…...

Linux内核VFS详解

Linux内核VFS是什么? Linux内核VFS(Virtual File System)是Linux操作系统中的一个关键组件,用于提供文件系统抽象层。它允许用户空间和内核空间的各个部分以一种一致的方式访问不同类型的文件系统,包括磁盘文件系统(如EXT4、XFS、NTFS)、网络文件系统(如NFS、CIFS)、…...

在自己的服务器上部署个人博客和开源项目:实现数字存在感

在数字时代&#xff0c;拥有自己的服务器不再是一项难以实现的任务。通过云计算和开源技术的广泛应用&#xff0c;个人可以轻松地拥有自己的服务器&#xff0c;并在其上部署个人博客以及开源项目&#xff0c;为自己在互联网上创造一个数字存在感。本文将介绍如何在自己的服务器…...

【AI视野·今日Robot 机器人论文速览 第五十九期】Fri, 20 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Fri, 20 Oct 2023 Totally 29 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers CCIL: Continuity-based Data Augmentation for Corrective Imitation Learning Authors Liyiming Ke, Yunchu Zhang, Abhay D…...

Chromium浏览器启动参数

文章目录 Chromium浏览器启动参数1. --disable-web-security2. --disable-gpu3. --incognito4. --no-sandbox5. --disable-infobars6. --disable-notifications7. --disable-extensions8. --disable-translate9. --disable-popup-blocking10. --remote-debugging-port=<port…...

【计算机视觉】MoCo v3 讲解

MoCo v3 论文信息 标题:An Empirical Study of Training Self-Supervised Vision Transformers 作者:Xinlei Chen, Saining Xie, Kaiming He 期刊:ICCV 2021 发布时间与更新时间:2021.04.05 2021.04.08 2021.05.05 2021.08.16 主题:计算机视觉、对比学习、MoCo arXiv:[21…...

MySQL - 对字符串字段创建索引

在数据库中&#xff0c;对字符串字段创建索引可以加速字符串字段的查询&#xff1a; 直接创建完整索引&#xff1a;这是最简单的方式&#xff0c;直接对整个字符串字段创建索引。这种方式占用的空间较大&#xff0c;但查询性能通常较好&#xff0c;特别是在精确匹配的情况下。…...

Qt pro文件中 CONFIG += debug 作用

作用 在 Qt 项目文件&#xff08;.pro 文件&#xff09;中&#xff0c;CONFIG debug 的作用是指定项目以调试模式进行构建。 当在项目文件中添加 debug 到 CONFIG 变量时&#xff0c;Qt 构建系统将使用调试配置来编译项目。 这意味着编译器将生成带有调试信息的可执行文件&a…...

java解析生成定时Cron表达式工具类

Cron表达式工具类CronUtil 构建Cron表达式 /****方法摘要&#xff1a;构建Cron表达式*param taskScheduleModel*return String*/public static String createCronExpression(TaskScheduleModel taskScheduleModel){StringBuffer cronExp new StringBuffer("");if(…...

庆祝1024

在CSDN1024这一天&#xff0c;我不禁回想起自己这几年来在这个平台上的经历。回忆着初来时的稚嫩&#xff0c;如今的迷茫与期待&#xff0c;我深深地感受到自己还需不断努力。 回想起八年前&#xff0c;我刚刚步入计算机科学与技术的领域&#xff0c;满怀激情地加入了CSDN这个高…...

时间格式记录

ISO 8601&#xff1a;这是一种国际标准的日期和时间表示方式&#xff0c;格式为YYYY-MM-DDTHH:mm:ss.sssZ&#xff0c;其中 YYYY 代表四位数年份&#xff0c;MM 代表月份&#xff0c;DD 代表天数&#xff0c;T 作为日期和时间的分隔符&#xff0c;HH 代表小时&#xff0c;mm 代…...

hive插入动态分区数据时,return code 2报错解决

目录 一、完整报错 二、原因 三、其他 一、完整报错 Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask 二、原因 大概率是因为没有开启允许动态分区或单次动态分区个数太小了。 -- 动态分区前…...

解决报错:gnutls_handshake() failed: The TLS connection was non-properly terminated.

执行git clone的时候&#xff0c;出现错误&#xff1a;gnutls_handshake() failed: The TLS connection was non-properly terminated. 如图&#xff1a; 解决方式&#xff1a; 两次重置代理&#xff1a;完美解决 git config --global --unset https.https://github.com.pro…...

《 汇编语言的系统学习》一、编程语言、机器语言与汇编语言

目录 《 汇编语言的系统学习》1、编程语言1.1 语言1.2 程序 2 编程语言分类2.1 机器语言2.2 汇编语言2.3 高级程序语言2.3.1 编译型2.3.1 解释型 《 汇编语言的系统学习》 1、编程语言 1.1 语言 定义&#xff1a;一种系统的&#xff0c;人与人之间通过声音、符号等进行交流的…...

【RocketMQ系列十四】RocketMQ中消息堆积如何处理

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…...

从特征多项式到行列式:揭秘矩阵特征值之积的几何意义

1. 特征多项式&#xff1a;打开矩阵奥秘的钥匙 我第一次接触特征多项式时&#xff0c;完全被这个抽象的概念搞晕了。直到有一天&#xff0c;我的导师用了一个简单的比喻&#xff1a;"特征多项式就像是矩阵的DNA检测报告&#xff0c;它能告诉我们这个矩阵最本质的特性。&qu…...

单位数码管

文章目录1&#xff0c;仿真图2&#xff0c;代码文章介绍效果图仿真图5_1放置单位数码管代码5_1.c1&#xff0c;仿真图 2&#xff0c;代码 #include <reg52.h>#define uchar unsigned char #define uint unsigned int// 定义锁存器控制引脚 sbit LE P2^7; // 74HC573的…...

巧用Option Bytes:解锁单片机NRST引脚的GPIO潜能

1. 为什么需要复用NRST引脚&#xff1f; 在开发低成本嵌入式系统时&#xff0c;我们经常会遇到引脚资源紧张的问题。就拿我最近做的一个智能家居传感器项目来说&#xff0c;选用了8引脚的PY32F002单片机&#xff0c;光是电源和地线就占了2个引脚&#xff0c;剩下的6个引脚要处理…...

告别“玩具AI”:联楷国际以商业大模型重塑本地生活,开启一人AI公司时代

在AI浪潮席卷全球的今天&#xff0c;一个尖锐的问题摆在无数中小企业主面前&#xff1a;当ChatGPT们成为茶余饭后的谈资&#xff0c;当各种AI绘画、AI聊天工具令人眼花缭乱时&#xff0c;真正能为我降本增效、解决实际经营痛点的AI在哪里&#xff1f; 喧嚣的“娱乐化AI”噱头之…...

WarcraftHelper:让经典魔兽争霸3重获现代游戏体验的兼容性增强工具

WarcraftHelper&#xff1a;让经典魔兽争霸3重获现代游戏体验的兼容性增强工具 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸3作为一款经典…...

Zenith.NET v0.0.7:Metal 后端落地,.NET GPU 抽象的跨平台旅程

为什么要做 Zenith.NET&#xff1f;.NET 生态有不少图形相关的库——绑定层如 Silk.NET、Vortice&#xff0c;抽象层如 Veldrid、Evergine。但现有的抽象层要么停留在较旧的 API 版本&#xff08;如 DX11/OpenGL&#xff09;&#xff0c;要么是商业引擎的一部分&#xff0c;难以…...

SI4463项目实战:如何像调试代码一样,用WDS3工具精准调试射频参数?

SI4463射频调试实战&#xff1a;用WDS3实现代码级精准配置 在嵌入式开发领域&#xff0c;我们早已习惯了通过断点调试、日志输出和变量监控来掌控程序行为。但当面对射频模块时&#xff0c;许多工程师却感到束手无策——那些神秘的十六进制配置值、模糊不清的寄存器描述&#x…...

GHelper:华硕笔记本性能优化与硬件控制的开源解决方案

GHelper&#xff1a;华硕笔记本性能优化与硬件控制的开源解决方案 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Sc…...

提升嵌入式开发效率:用快马平台一键生成串口通信等常用模块代码

作为一名嵌入式开发者&#xff0c;我经常需要和串口通信打交道。无论是调试信息输出、设备间通信还是固件升级&#xff0c;UART都是最常用的外设之一。但每次新项目都要重新写一遍串口初始化、中断处理这些重复性代码&#xff0c;实在有点浪费时间。最近发现InsCode(快马)平台能…...

每日一道面试题 08:SpringBoot 自动配置原理

一、核心前提SpringBoot 核心优势&#xff1a;自动配置&#xff0c;无需手动编写大量 XML 配置&#xff0c;简化开发&#xff08;本质是 “约定优于配置”&#xff09;自动配置底层依赖&#xff1a;EnableAutoConfiguration 注解 Spring 工厂加载机制 条件注解核心目标&#…...