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 个元素的地址。如何理解呢?下标运算符的规则括号 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的配置文件中进行配置: <bean class"com.test.interceptor.FirstInterceptor"></bean> …...
redis的实际使用
Redis是一种内存数据库,常用于缓存、会话管理、消息队列等。在项目中合理使用Redis可以提高系统性能和可扩展性。以下是一些使用Redis的建议: 1. 缓存常用数据:将经常使用的数据缓存在Redis中,以减少数据库的读取次数,…...
造车先做三蹦子-之二:自制数据集(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年,其目的是为浏览器显示的文档赋予动态行为。 1 Web编程基础 本节讲解如何编写Web应用中的js程序,如果将这些程序加载到浏览器,以及如何获取输入、产出输出,如何运行响应事件的异步代码。 1.1 js 脚本 虽然现在不…...
Linux内核VFS详解
Linux内核VFS是什么? Linux内核VFS(Virtual File System)是Linux操作系统中的一个关键组件,用于提供文件系统抽象层。它允许用户空间和内核空间的各个部分以一种一致的方式访问不同类型的文件系统,包括磁盘文件系统(如EXT4、XFS、NTFS)、网络文件系统(如NFS、CIFS)、…...
在自己的服务器上部署个人博客和开源项目:实现数字存在感
在数字时代,拥有自己的服务器不再是一项难以实现的任务。通过云计算和开源技术的广泛应用,个人可以轻松地拥有自己的服务器,并在其上部署个人博客以及开源项目,为自己在互联网上创造一个数字存在感。本文将介绍如何在自己的服务器…...

【AI视野·今日Robot 机器人论文速览 第五十九期】Fri, 20 Oct 2023
AI视野今日CS.Robotics 机器人学论文速览 Fri, 20 Oct 2023 Totally 29 papers 👉上期速览✈更多精彩请移步主页 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 - 对字符串字段创建索引
在数据库中,对字符串字段创建索引可以加速字符串字段的查询: 直接创建完整索引:这是最简单的方式,直接对整个字符串字段创建索引。这种方式占用的空间较大,但查询性能通常较好,特别是在精确匹配的情况下。…...
Qt pro文件中 CONFIG += debug 作用
作用 在 Qt 项目文件(.pro 文件)中,CONFIG debug 的作用是指定项目以调试模式进行构建。 当在项目文件中添加 debug 到 CONFIG 变量时,Qt 构建系统将使用调试配置来编译项目。 这意味着编译器将生成带有调试信息的可执行文件&a…...
java解析生成定时Cron表达式工具类
Cron表达式工具类CronUtil 构建Cron表达式 /****方法摘要:构建Cron表达式*param taskScheduleModel*return String*/public static String createCronExpression(TaskScheduleModel taskScheduleModel){StringBuffer cronExp new StringBuffer("");if(…...
庆祝1024
在CSDN1024这一天,我不禁回想起自己这几年来在这个平台上的经历。回忆着初来时的稚嫩,如今的迷茫与期待,我深深地感受到自己还需不断努力。 回想起八年前,我刚刚步入计算机科学与技术的领域,满怀激情地加入了CSDN这个高…...
时间格式记录
ISO 8601:这是一种国际标准的日期和时间表示方式,格式为YYYY-MM-DDTHH:mm:ss.sssZ,其中 YYYY 代表四位数年份,MM 代表月份,DD 代表天数,T 作为日期和时间的分隔符,HH 代表小时,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的时候,出现错误:gnutls_handshake() failed: The TLS connection was non-properly terminated. 如图: 解决方式: 两次重置代理:完美解决 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 语言 定义:一种系统的,人与人之间通过声音、符号等进行交流的…...

【RocketMQ系列十四】RocketMQ中消息堆积如何处理
您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦。 💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

盲盒一番赏小程序:引领盲盒新潮流
在盲盒市场日益火爆的今天,如何才能在众多盲盒产品中脱颖而出?盲盒一番赏小程序给出了答案,它以创新的玩法和优质的服务,引领着盲盒新潮流。 一番赏小程序的最大特色在于其独特的赏品分级制度。赏品分为多个等级,从普…...
python打卡第48天
知识点回顾: 随机张量的生成:torch.randn函数卷积和池化的计算公式(可以不掌握,会自动计算的)pytorch的广播机制:加法和乘法的广播机制 ps:numpy运算也有类似的广播机制,基本一致 **…...

MQTT协议:物联网时代的通信基石
MQTT协议:物联网时代的通信基石 在当今快速发展的物联网(IoT)时代,设备之间的通信变得尤为重要。MQTT(Message Queuing Telemetry Transport)协议作为一种轻量级的消息传输协议,正逐渐成为物联…...

c++ decltype关键字
decltype为类型推导关键字。 示例代码: // decltype也可用于函数模板编程: template<typename T, typename U> auto add(T t, U u) -> decltype(t u) {return t u; }// decltype推导函数返回类型 auto doubleNumFunc(int x) -> decltype(x * 2) {ret…...
QuaggaJS用法详解
QuaggaJS简介 QuaggaJS是一个强大的JavaScript库,专门用于在浏览器环境中进行条形码和二维码识别。它支持多种条形码格式,包括Code 128、Code 39、EAN、QR码等,并且可以直接调用设备摄像头进行实时扫描。 QuaggaJS核心功能与用法 1. 基本配…...