当前位置: 首页 > 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从入门到精…...

Ubuntu 下 P106-100 矿卡 `nvidia-smi No devices were found` 问题解决全过程

Ubuntu 下 P106-100 矿卡 nvidia-smi No devices were found 问题解决全过程 最近折腾一张老矿卡 P106-100,在 Ubuntu 下遇到一个非常经典的问题: nvidia-smi No devices were found但是: lspci | grep -i nvidia却能看到显卡: 01:00.0 3D controller: NVIDIA Corporat…...

国产高性能MCU如何破局?拆解先楫半导体RISC-V芯片的落地逻辑

1. 从展会到产线&#xff1a;拆解先楫半导体高性能MCU的落地逻辑前几天在深圳的Elexcon电子展上逛了一圈&#xff0c;最大的感触是&#xff0c;国产芯片的“高性能”这三个字&#xff0c;终于不再是PPT上的口号&#xff0c;而是能实实在在摸到、测到、甚至直接拿来设计产品的硬…...

保姆级教程:用Unity+OpenCVSharp插件实现摄像头实时轮廓检测与交互(附完整C#代码)

Unity与OpenCVSharp实战&#xff1a;从摄像头捕捉到交互式轮廓检测全流程解析 在游戏开发与计算机视觉的交叉领域&#xff0c;实时图像处理正成为增强玩家沉浸感的新 frontier。想象一下&#xff1a;玩家只需在摄像头前挥动手势&#xff0c;游戏中的角色就能同步做出反应&#…...

告别手动传Token!用JMeter的JSON Extractor搞定接口自动化登录(附实战配置)

告别手动传Token&#xff01;用JMeter的JSON Extractor实现无缝接口自动化登录 在接口测试的世界里&#xff0c;登录态管理就像一场永无止境的接力赛——每次请求都需要准确传递Token这个"接力棒"。传统的手工复制粘贴Token不仅效率低下&#xff0c;更是自动化测试流…...

手把手教你用LwIP RAW API在STM32上实现一个能自动重连的TCP客户端

基于LwIP RAW API的STM32 TCP客户端自动重连实战指南 在物联网终端设备开发中&#xff0c;网络连接的稳定性直接决定了产品的可靠性。想象一下&#xff0c;一个部署在工厂车间的环境监测设备&#xff0c;如果因为Wi-Fi信号波动导致数据中断&#xff0c;可能让整个生产线失去关键…...

SpringBoot+Vue学生竞赛管理系统源码+论文

代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 分享万套开题报告任务书答辩PPT模板 作者完整代码目录供你选择&#xff1a; 《SpringBoot网站项目》1800套 《SSM网站项目》1500套 《小程序项目》1600套 《APP项目》1500套 《Python网站项目》…...

LAMMPS GPU加速踩坑实录:CUDA driver error 4报错,原来问题出在CPU核数上

LAMMPS GPU加速实战&#xff1a;从CUDA driver error 4报错到性能调优全解析 当你在深夜的实验室里盯着终端不断刷新的红色报错信息&#xff0c;那种挫败感我深有体会。作为一名长期使用LAMMPS进行分子动力学模拟的研究者&#xff0c;我清楚地记得第一次遇到"CUDA driver …...

麦肯锡AI揭秘:AI的真正价值不在算法,而在重构组织与结构竞争力

【摘者按&#xff1a;麦肯锡在《The State of AI 2025》报告中深刻指出&#xff0c;AI的真正价值早已超越了单纯的算法性能&#xff0c;其核心在于通过“重构”来重塑企业的组织与结构竞争力。当企业走出“试点炼狱”&#xff0c;不再将AI视为简单的技术堆砌&#xff0c;而是将…...

从点击到意图:鸿蒙 App 的 AI 进化

子玥酱 &#xff08;掘金 / 知乎 / CSDN / 简书 同名&#xff09; 大家好&#xff0c;我是 子玥酱&#xff0c;一名长期深耕在一线的前端程序媛 &#x1f469;‍&#x1f4bb;。曾就职于多家知名互联网大厂&#xff0c;目前在某国企负责前端软件研发相关工作&#xff0c;主要聚…...

企业视频会议系统从公有云迁移到私有化环境:完整数据迁移指南

摘要&#xff1a;企业从Zoom、腾讯会议等公有云SaaS视频会议系统迁移到私有化部署的会议平台时&#xff0c;需要处理用户数据、历史会议记录、录制文件等关键资产的平滑过渡。本文提供一套经过生产验证的迁移方案&#xff0c;涵盖数据导出、批量导入、API对接、录制文件转存及验…...