C/C++拾遗:关于数组的指针和数组元素首地址的一道经典题

指针和地址 数组名和首元素地址 其实很简单 纯手机编写 多多包涵。 指针是什么?是地址吗? 数组名是指针吗?还是首元素地址? 在讨论问题之前,我想问问大家,是怎么理解=号的。 我来说说自己的想法,可能c++并不是这样定义。 1,=号的用法: (左值)地址=数据(右边), 也就是说 对于编译器来说就是 把右边的数据 写入 左边的地址。 什么是右值: 什么是左值。 变量在=号右边的或者没有等号的时候 ,就是右值 在 变量在=号左边就是左值。 变量是右值的时候,就是存放到地址里面的数据的别名 变量名是左值的时候,就是数据存放的地址的别名。 问题一: 1, 阅读详情
 #include <stdio.h>int main(void){
      int  a[5] = {1, 2, 3, 4, 5};   
      int  *ptr = (int *)(&a+1); 
      int *p1 = a;    
      int *p2 = &a[0];    
      int *p3 = (int *)(&a);  
      if(p1 == p2){     
        printf("p1 == p2\n");   
      }else{      
        printf("p1 != p2\n");   
      }if(p1 == p3){     
        printf("p1 == p3\n");   
      }else{      
        printf("p1 != p3\n");   
      }if(p2 == p3){      
        printf("p2 == p3\n");   
      }else{      
        printf("p2 != p3\n");
      }  
      printf("%d %d\n",*(a+1),*(ptr-1));  
      int *p4 = ++p1; 
      int *p5 = ++p3; 
      if(p4 == p5){     
        printf("p4 == p5\n");   
      }else{  
        printf("p4 != p5\n");   
      }   
       return 0;
 }  
最终输出结果如下:
里面所有的判断都是相等,打印的两个值是2和5.
原因如下:
&a是数组的首地址,它的类型是int(*)[5],因此+1是加的是数组个数的步长。指针加1要根据指针自身类型加上一定的值,
不同类型的指针+1之后增加的大小不同。因此&a + 1后指向的地址对数组来说是越界的,注意前面有个int(*)又强制将他转为int*了。
因此计算*(ptr - 1)的时候,ptr是个int类型的指针,减一等于往左移动sizeof(int*)个字节,因此又指向a[4]了,他的值等于&a[4].
为此大家又对p4和p5作了验证,为啥结果p4会等于p5呢?原因就在于申请p3的时候对&a进行了强制类型转换,
view plaincopy to clipboardprint?
int *p3 = (int *)(&a);  
如果不加这个转换,是编译不过去的。加了转换之后p3等于p1也等于p2,他的类型跟另外两个一样都是int*类型的了,

因此移动相同位后地址也是一样的。很多人纠结就纠结在&a、a、&a[0],根本原因在于对&a进行了强制类型(int*)转换。

Python+Flask+Echarts打造全国气象数据可视化分析大屏 本文详细介绍了如何使用Python+Flask+Echarts构建全国气象数据可视化分析大屏,实现实时监控、趋势分析和快速决策。通过Python强大的数据处理能力、Flask的轻量级优势和Echarts的交互体验,打造高效的气象数据可视化系统,提升农业、物流等行业的决策效率。 阅读详情

相关推荐

从零开始掌握Python机器学习:七步教程 基础篇

前言 「开始」往往是最难的,尤其是当选择太多的时候,一个人往往很难下定决定做出选择。本教程的目的是帮助几乎没有 Python 机器学习背景的新手成长为知识渊博的实践者,而且这个过程中仅需要使用免费的材料和资源即可。 第一步:基本 Python 技能 如果我们打算利用 Python 来执行机器学习,那么对 Python 有一些基本的了解就是至关重要的。 首先,你需要安装 Python。因为我们后...

hcgx2018的博客 1613

问题剖析:指向数组的指针与指向数组首元素的指针。

这两行代码看似很像,但是指向的完全不是一个东西。还有要分清数组和数组首元素的概念,要牢记大袋子,小袋子,和糖果的比喻。不要再混淆了!!!

weixin_49503250的博客 704

详解TCP/IP五层模型

TCP/IP模型是一个网络通信体系结构,由五层组成,每一层都有其特定的功能。应用层传输层网络层数据链路层物理层每一层都有不同的责任,通过这种层次结构,网络通信可以更有效地进行。

2201_75437633的博客 1万+

还搞不清楚数组地址,数组首元素地址和指针的关系?一篇带你从入门到精通

在C语言编程学习过程中,不少老铁会特别头大这个数组和指针之间的关系。例如arr[],这个arr一会又是代表数组首元素地址,一会又是代表数组地址,甚至有的老铁还会疑惑,啥是数组地址呀!??那么这篇文章将会带你彻底搞懂这二者之间的关系。

weixin_57537814的博客 4196

实战分享:如何利用svchost进程绕过360防护(附完整Shellcode注入教程)

本文深入解析系统进程安全防护机制,探讨svchost等关键进程的安全特性与防护策略。详细分析安全软件的行为检测和内存保护技术,提供系统加固与监控实践建议,助力企业构建多层次防御体系,有效应对潜在安全威胁。

weixin_30752699的博客 99

【无标题】IP804A参考资料和管脚作用图

3.3V内置led控制内置EEPROM接口,用于哑应用ip804a,可集成为4X N端口PSE稳压器内置支持外部设备。多个系统和IC总线用于从每个IP804A收集PD电源状态,以支持全局电源管理。多个ip804a可以构建一个具有成本效益的PHY级PSE系统以支持PD分类和电源管理,而无需主机。基于LLDP(IEEE标准8023AT-2009的一部分),可以实时维护PSE和PD之间的动态电源管理,以提高电源效率。IP804A是一款用于POE(以太网供电)系统的4端口PSE(电源设备)控制器IC。

2301_78055735的博客 1059

C/C++拾遗(一):关于数组的指针和数组元素首地址的一道经典题

代码如下:#include int main(void) { int a[5] = {1, 2, 3, 4, 5}; int *ptr = (int *)(&a+1); int *p1 = a; int *p2 = &a[0]; int *p3 = (int *)(&a); if(p1 == p2){ printf("p1 == p2\n"); }else{ pr

yanzi1225627的专栏 5637

【Pytorch】DCGAN实战(三):二次元动漫头像生成

文章目录1.实现效果2.环境配置2.1Python2.2Pytorch、CUDA2.3Python IDE3.具体实现3.1数据预处理(data.py)(1)导入包(2)定义数据类3.2模型Generator,Discriminator,权重初始化(model.py)(1)导入包(2)Generator(3)Discriminator(4)权重初始化3.3网络训练(net.py)(1)导入包(2)创建类3.4 主函数(main.py)(1)导入文件(2)定义超参数(3)实例化(4)进行训练4.训练过程4.1

qq_44031210的博客 4916

数组首地址和指针本质的差别

数组首地址为一个常量,而指针是一个变量 数组首地址不可以作为左值(常量不可以作为左值),而指针可以 指向数组首地址的指针在功能上等同于数组首地址,使用sizeof时候数组首地址等同于数组本身 ...

wq3028的博客 1736

YOLOv13结合Sobel边缘检测算子,实现EIEM(Edge Information Enhancement Module,边缘信息增强模块),强化空间特征提取

EIEM模块通过巧妙地结合Sobel边缘检测算子和现代卷积网络架构,实现了显式边缘信息增强的创新设计。这种方法不仅提高了网络对边缘特征的敏感性,还保持了良好的计算效率和模块化特性。 从技术实现角度看,EIEM展示了如何将经典计算机视觉算法无缝集成到深度学习框架中,为构建更强大、更可解释的视觉模型提供了新的思路。随着对边缘信息重要性认识的不断深入,以及对网络可解释性需求的增长,EIEM这样的显式特征增强模块将在未来的计算机视觉研究中发挥越来越重要的作用。

FJN110的博客 906

【Halcon-2D测量】add_metrology_object_rectangle2_measure 函数功能(用于向2D计量模型中添加旋转矩形(rectangle2类型)计量对象)

HALCON算子add_metrology_object_rectangle2_measure解析摘要 该算子是HALCON 2D计量模块的核心算子,用于添加旋转矩形计量对象并配置测量参数。主要功能包括:定义旋转矩形几何轮廓(中心坐标、主轴角度、长短半长);生成垂直于矩形边界的测量区域;设置边缘提取预处理参数(高斯平滑、振幅阈值)。关键注意事项:MeasureLength1必须小于矩形长短半长;角度参数Phi需使用弧度单位;多线程需同步模型句柄。该算子适用于方形螺母、PCB板边框等矩形零件的精密测量,需与a

weixin_45590420的博客 1223

嵌入式开发一站式学习:从51单片机到Linux系统实战路径

嵌入式系统开发作为连接硬件与软件的核心技术领域,其本质是通过微控制器和操作系统实现对物理设备的智能控制。从基础的51单片机GPIO操作、中断处理,到STM32的HAL库应用、DMA传输原理,再到Linux系统移植、设备树配置,每个技术环节都遵循着从底层硬件驱动到上层应用开发的逻辑链条。这种技术栈的价值在于能够构建完整的智能硬件系统,广泛应用于物联网、工业控制、智能家居等场景。在实际的嵌入式学习过程中,单片机开发与Linux系统编程的有机结合尤为重要,通过项目实战如智能环境监测系统,可以系统掌握传感器数据采集

aodiyi6351的博客 441

分布式训练中All-Reduce、All-Gather、Reduce-Scatter原理

Reduce-Scatter = 先对所有进程的数据做 Reduce(如 sum / mean),再把结果“切分”分发给各进程。(是 Reduce + Scatter 的融合操作。

comli_cn的博客 340

C++拾遗之对数组名取地址

int a[5]={1,2,3,4,5}; int b[100]; 一个数组名代表的是数组中第一个元素的位置,通过数组名我们可以访问数组,先看下面两个问题: 问题一: 看到一篇文章这么写的。。 int array[10];  int (*ptr)[10];  ptr=&array;//这里说明&array是指向数组的指针,但为什么&array是指向数组的指针?  答一: 对数组名

yy13210520的专栏 1244

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++沙海拾遗(三)

C++沙海拾遗值数组、指针和复合数据类型

weixin_38898944的博客 512

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【C++】拾遗

本博客主要记录C++使用过程中的一点偏门问题。

记录学习成长之路,进一寸有进一寸的欢喜 651

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

大话 函数指针 和 指针函数

一:起因 (1)指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针,即我们常见的函数类型,且返回值是指针。 (2)函数指针是指向函数的指针变量,即本质是一个指针变量,是一个指向函数(可能是代码区)的首地址的指针,正如我们都知道,数组名就是指向数组第一个元素的常量指针(详见《数组拾遗》)。同理,对于一个函数而言,函数名也是指向函数第一条指令的常量指针。而编译器要做的就是在程

思緒凌亂 2846

c语言拾遗录之数组

1、数组名的本质数组名的本质相当于一个常量指针如:int a[10] a<=>int *const a;int b[10][20] b<=>int (*const b)[20]所以a[5]==*(a+5); b[8][9]==*(*(b+8)+9)==*(b+8)[9]; 2、数组在函数中传参时会被降级为指针3、数组大小 #incl...

weixin_33978016的博客 72

C++拾遗

1三个概念 字符串字面值是一串常量字符(是一个常量),字符串字面值常量用双引号括起来的零个或多个字符表示,为兼容C语言,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符。字符串字面值的类型就是  const char 类型的数组。标准库函数 strlen 用于计算 C 风格字符串中的字符个数, 不包括 null 结束符。 C++风格字符串:string 那么string a1

一步一脚印 1327

C语言-拾遗(2) 指针 && 声明

几个容易混淆的概念: 指针常量:即指针本身的值是不可改变的,而指针指向的变量的值是可以改变的; 常量指针:即指针指向的变量的值是不可改变的,而指针本身的值是可以改变的; 指向常量的指针 指针函数:函数,返回的是一个指针 函数指针:指针,指向一个函数(这里可以继续嵌套,指向的函数返回一个函数指针........) 数组指针:指针,指向数组 指针数组:数组内存放的是指针 指针与数组 1

gg_gogoing的专栏 923

C/C++拾遗

1、++分为前置和后置,前置++比+运算优先级高,后置比+运算符优先级低。 2、gets函数是读取字符串,以回车键结束,fgets是读取一行字符,以换行符结束,getc读入一个字符,fgetc读取一个字符,读取一个字节后后移一位 。 3、C中的结构体没有函数 但是C++的结构体可以有函数;这是C与C++结构体的区别。 C++的结构体可以被类取代,因为类相对于结构体 具有封装性等优势。 ...

于书盼的博客 415

c++ 拾遗

typedef的用法 typedef的作用是真正意义上地定义一种别名,而不是一种简单的宏替换。 typedef 与 #define的区别: 案例一: 通常讲,typedef要比#define要好,特别是在有指针的场合。请看例子: typedef char *pStr1; #define pStr2 char *; pStr1 s1, s2; pStr2 s3, s4;在上述...

weixin_33753845的博客 95

C语言拾遗

main函数参数   C语言规定main函数参数只能有两个,习惯上这两个参数写成argc和argv。C语言还规定argc必须是整形变量,argv必须是指向字符串的指针数组。 因此,main函数的函数头应该写为: main(argc,argv) int argc; char *argv[]; 或者:main(int argc,char *argv[]) main函数的参数值是从操作系

zhangskd的专栏 1566

大话 函数指针与指针函数

一:起因 (1)指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针,即我们常见的函数类型,且返回值是指针。 (2)函数指针是指向函数的指针变量,即本质是一个指针变量,是一个指向函数(可能是代码区)的首地址的指针,正如我们都知道,数组名就是指向数组第一个元素的常量指针(详见《数组拾遗》)。同理,对于一个函数而言,函数名也是指向函数第一条指令的常量指针。而编译器要做的

s331397964的专栏 286

解析:数组名a、数组名取地址&a、数组首地址&a[0]、数组指针*p

数组和指针向来就是傻傻分不清,当他们一起出现的时候就更加懵逼。使用实例详细解析:数组名a、数组名取地址&a、数组首地址&a[0]、数组指针*p

loongkingwhat的博客 5万+
上一篇: 各种排序算法总结
下一篇: Kettle 体系架构
romaticjun2011
博客等级 码龄15年 6粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值