Linux C语言:指针与数组

一、指针与数组的基本用法

  • 数组指针是指数组在内存中的起始地址,数组元素的地址是指数组元素在内存中的起始地址
  • 一维数组的数组名为一维数组的指针(起始地址)

例如:

double x[8];
因此,x为x数组的起始地址

  • 设指针变量px的地址值等于数组的指针x(即指针变量px指向数组的首元数),则: 

        x[i] 、*(px+i)、*(x+i) 和px[i]具有完全相同的功能:访问数组第i+1个数组元素。 

  • 使用指针遍历一维数组

  •  指针变量和数组在访问数组中元素时,一定条件下其使用方法具有相同的形式,因为指针变量和数组名都是地址量 

1.数组指针与指针数组:
数组指针:是一个指向数组的指针
指针数组:是一个储存指针的数组

数组指针(表示一维数组)

#include <stdio.h>int main()
{int (*p)[3];/*定义了一个数组指针,指向了一个数组长度为3的一维数组,注意是指向一个数组,所以赋值给他的地址要是数组类型的地址可以这样理解:一维数组名就是一个指针这里只是用指针的形式代替了数组名 ,注意这里的3要和指向的数组长度相同*/ int a[3] = {1,2,3};p = &a;/*将数组a地址赋值给p,此时(*p)[i]相当于a[i],注意不能写成p=a,或者p=&a[0]因为指针p是指向一个数组,p=a表示p指向首个元素的地址,虽然&a,&a[0],a的结果是一样的(这是因为数组一般用其首元素地址表示) */printf("数组指针指向一维数组的遍历:\n"); for(int i=0; i<3; i++){printf("%d\n",(*p)[i]);}/*这里要用指针遍历输出a不能用*(p+i)方式输出,因为p表示数组a的地址(一般用数组中首个元素地址表示), p++表示p要增加3*4个字节长度(3为数组指针指定的长度,4为int所占空间大小)  */ printf("--------------------------\n");printf("&a=%d\n",&a);//输出a的地址 printf("p=%d\n",p);//p指向了数组a,所以输出为a的地址(一般用数组中首个元素地址表示)printf("*p=%d\n",*p);//既然p指向了数组a,那么*p则为数组a本身(一般用数组中首个元素地址表示)printf("p+1=%d\n",p+1);printf("*(p+1)=%d\n",*(p+1));//,运用公式*(p+1) == p[1],可以想象成刚好超过a长度的那个地址,p+1表示p要增加3*4个字节长度(3为数组指针指定的长度,4为int所占空间大小)==*(p+1)printf("**p=%d\n",**p);//p指向a,*p表示a本身(一般用数组中首个元素地址表示),那么**p表示*a,表示数组首元素。printf("p[0]=%d\n",p[0]);//p[0] == *p ,*p又是a本身,所以输出a首元素地址printf("*p[0]=%d\n",*p[0]);//既然p[0]为数组首元素地址,那加上个*就为a的首元素 return 0;
} 

二、指针与数组使用注意事项 

 1、数组名和指针有什么区别

1)含义不同

        数组名代表一个数组,存放相同类型的元素指针代表存储地址的变量

2)使用不同

        数组名代表一个数组,存放相同类型的元素指针代表存储地址的变量

3)长度不同

        sizeof数组名,代表数组占用的总空间
        sizeof指针,和操作系统有关,32位系统,4个字节

4) 本质不同

        指针变量是地址变量,而数组名是地址常量

三、总结 

int a[3][4]={0};
1、printf(“%d\n”,sizeof(a));
        解:sizeof(a)表示计算整个数组的大小,为344=48
2、printf(“%d\n”,sizeof(a[0][0]));
        解:a[0][0]表示数组a中的第一个元素,sizeof(a[0][0])计算数组a中第二个元素所占空间大小;
3、printf(“%d\n”,sizeof(a[0]));
        解:a[0],相当于第一行的地址,表示第一行所有元素。为:4*4=16;

4、printf(“%d\n”,sizeof(a[0]+1));
        解:a[0]没有单独放在sizeof()内部,也没有取地址,所以它现在表示第一行第一个元素的地址,a[0]+1表示第一行第二个元素的地址;sizeof()计算地址为:4/8;
5、printf(“%d\n”,sizeof(*(a[0]+1)));
        解:对第一行第二个元素解引用,表示计算第二个元素所占空间的大小,为4;
6、printf(“%d\n”,sizeof(a+1));
        解:a是二维数组的数组名,并没有取地址,也没有单独放在sizeof()内部,所以a表示二维数组首元素地址,即第一行的地址,a+1就表示第二行的地址;计算地址为:4/8;
7、printf(“%d\n”,sizeof(*(a+1)));
        解:对第二行解引用,计算第二行所有元素大小,为16;
8、printf(“%d\n”,sizeof(&a[0]+1));
        解:&a[0]+1表示取出第二行的地址,计算地址大小为4/8;
9、printf(“%d\n”,sizeof((&a[0]+1));
        解:16,(&a[0]+1)表示对第二行解引用,求第二行所有元素所占空间的大小;
10、printf(“%d\n”,sizeof(*a));
        解:16;a没有单独放在sizeof()内部,所以a表示二维数组首地址即:第一行的地址,*a对第一行解引用,求第一行所有元素所占空间的大小;
11、printf(“%d\n”,sizeof(a[3]));
        解:16;a[3]其实是第四行的地址(如果存在的话),其实在内存中并不存在a[3],但是sizeof并不会计算表达式的值,它也会通过表达的类型计算它所占空间大小;我们知道,一个表达式:int a= 3+5;a有两个属性,一个值属性:8,一个类型属性:int,而size of()是计算变量所占空间大小,即表达式的类型所占空间大小,它并不会计算表达式的值。

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

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

相关文章

Contrmix:用于半监督医学图像分割的渐进式混合对比学习

paper:Contrmix: Progressive Mixed Contrastive Learning for Semi-Supervised Medical Image Segmentation | IEEE Conference Publication | IEEE Xplore 摘要:虽然医学图像分割已经取得了令人印象深刻的进展,但它通常受到劳动密集型和昂贵的像素级注释的限制。现有的半监…

什么是浏览器指纹

在数字互联网时代&#xff0c;我们的在线活动几乎都会留下痕迹。其中&#xff0c;浏览器指纹就像我们的数字身份证&#xff0c;让网站能够识别和追踪用户。本文将详细介绍浏览器指纹是什么&#xff0c;它如何工作。 一、什么是浏览器指纹 浏览器指纹&#xff08;Browser Fing…

【C语言 || 排序】希尔排序

文章目录 前言1.希尔排序1.1 直接插入排序1.2 直接插入排序的实现1.2.1 直接插入排序的代码实现 1.3 直接插入排序的时间复杂度1.4 希尔排序1.4.1 希尔排序概念1.4.1 希尔排序的代码实现 前言 1.希尔排序 1.1 直接插入排序 在写希尔排序之前&#xff0c;我们需要先了解直接插入…

二次规划(Lagrange 方法,起作用集方法)

二次规划是非线性规划中一种特殊情形&#xff0c;它的目标函数是二次实函数&#xff0c;约束是线性的。由于二次规划比较简单&#xff0c;便于求解&#xff0c;且一些非线性规划可以转化为求解一系列二次规划问题&#xff0c;因此二次规划算法较早引起人们的重视&#xff0c;成…

Mariadb10.11.2

1、跳过安全模式启动 忘记密码的时候使用&#xff0c;非常好使 停止服务&#xff1a;systemctl stop mariadb 安全模式&#xff1a;mysqld_safe --skip-grant-tables & 登录MySQL&#xff1a;mysql -u root 修改密码&#xff1a;update mysql.user set passwordpassword(新…

Java面试题:解释HashSet和TreeSet的内部实现差异,以及它们的性能特点

HashSet和TreeSet是Java中实现Set接口的两种常见集合类&#xff0c;它们在内部实现和性能特点上有显著差异。以下是详细的对比分析&#xff1a; 内部实现 HashSet 数据结构&#xff1a;HashSet基于哈希表&#xff08;Hash Table&#xff09;实现。存储方式&#xff1a;使用哈…

stable diffusion 局部重绘 reference-only api 接口调试

webUI api payload 插件生成的接口参数不准确&#xff0c;reference-only 的image不是对象&#xff0c;就是不同字符串字段&#xff0c;直接传&#xff0c;不是套image。 综上&#xff0c;那个插件参数不确定&#xff0c;应直接看插件的源码&#xff0c;看它接受什么参数 错误…

Paper Reading: PAMS:通过参数化最大尺度量化超分辨率

PAMS: Quantized Super-Resolution via Parameterized Max Scale PAMS&#xff1a;通过参数化最大尺度量化超分辨率, ECCV 2020 paper: https://arxiv.org/pdf/2011.04212.pdf GitHub: https://github.com/colorjam/PAMS 摘要 深度卷积神经网络&#xff08;DCNNs&#xff09;…

MFC工程的MFC库使用方式与运行时库不一致引起的编译问题

前段时间从网上下来一个有意思的代码&#xff0c;用VS2010打开时需要将工程转换为2010的工程&#xff0c;转化后却出现了编译不通过的问题&#xff0c;类似这样的错误&#xff1a;c:\program files\microsoft visual studio 10.0\vc\atlmfc\include\afxver_.h(81): fatal error…

“Photoshop AI插件:StartAI的全面使用攻略

随着人工智能技术的飞速发展&#xff0c;Photoshop作为设计师们不可或缺的工具&#xff0c;也在不断地融入AI技术&#xff0c;以提升设计效率和效果。在2024年&#xff0c;PSAI插件StartAI因其强大的功能和易用性&#xff0c;成为了Photoshop用户的得力帮手。下面来给大家详细介…

CentOS 7x 使用Docker 安装oracle11g完整方法

1.安装docker-ce 安装依赖的软件包 yum install -y yum-utils device-mapper-persistent-data lvm2添加Docker的阿里云yum源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo更新软件包索引 yum makecache fast查看docker…

深入浅出 Babel:现代 JavaScript 的编译器

在现代前端开发中&#xff0c;JavaScript 的版本更新速度非常快&#xff0c;新的语法和特性层出不穷。然而&#xff0c;旧版本的浏览器并不总是支持这些新特性。为了确保代码的兼容性和稳定性&#xff0c;我们需要一个工具来将现代 JavaScript 代码转换为旧版本的代码。Babel 就…

信息打点web篇----企业宏观资产打点

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 专栏描述&#xff1a;因为第一遍过信息收集的时候&#xff0c;没怎么把收集做回事 导致后来在实战中&#xff0c;遭遇资产获取少&#xff0c;可渗透点少的痛苦&#xff0c;如今决定 从头来过&#xff0c;全面全方位…

python安装系列问题

python3.4版本以上安装了python之后自带安装python。 1、换源 以Windows&#xff0c;清华源为例&#xff1a; 直接在user目录中创建一个pip目录&#xff0c;例如&#xff1a;C:\Users\xx\pip&#xff0c;新建文件pip.ini&#xff0c;内容如下: [global] index-url https:/…

JAVA小知识24:集合工具类Collections

一、Collections简介 Collections 是 Java 中的一个实用类&#xff0c;位于 java.util 包中&#xff0c;提供了许多静态方法&#xff0c;用于操作或返回集合的各种操作。它包含的这些方法大大简化了对集合的常见操作&#xff0c;提供了排序、搜索、随机化、同步化等功能。 二…

C#的Switch语句3(如何为一段代码应用多个case标签)

文章目录 上一篇文章中断函数执行堆叠caseswitch中实用的字符串函数将字符串转换为小写 switch例子 上一篇文章 C#的Switch语句2 中断函数执行 switch语句内部可以使用return语句&#xff0c;这为控制程序流程和函数返回值提供了一种直接的方式。 当在switch语句块中遇到re…

状态机和行为树的搭配使用

下面是一个完整的TypeScript代码示例&#xff0c;展示了如何将状态机和行为树结合起来使用。状态机控制智能体的状态&#xff0c;行为树负责智能体的智能决策。在执行决策前&#xff0c;行为树会检查状态机的当前状态。 // 定义状态枚举 enum BodyState {IDLE,MOVING,ATTACKIN…

asyncua模块中OPC UA的ua.Variant如何表示字典?

asyncua 模块中OPC UA的ua.Variant如何表示字典&#xff1f; 解决办法&#xff1a;使用json将字典转成string形式 文心一言给出的解决方法如下&#xff1a; 在 OPC UA (OLE for Process Control Unified Architecture) 中&#xff0c;ua.Variant 是一个用于表示各种数据类型…

CleanShot X for Mac v4.7 屏幕截图录像工具(保姆级教程,小白轻松上手,简单易学)

Mac分享吧 文章目录 一、准备工作二、部分特有功能效果1、截图软件的普遍常用功能&#xff08;画框、箭头、加文字等&#xff09;都具备&#xff0c;不再详细介绍2、ABCD、1234等信息标注&#xff08;每按一下鼠标&#xff0c;即各是A、B、C、D...等&#xff09;3、截图更换背…

SD-WAN组网如何帮助企业降低网络成本?

企业在构建IT网络时&#xff0c;常常面临节省费用和提升效益的挑战。IT开销主要包括设备、网络和维护成本。利用OgCloud的SD-WAN组网方案&#xff0c;企业可以有效地应对这些问题。 企业专线网络的高成本问题 企业专线的费用较高&#xff0c;而且数据不能同时在多条专线上传输。…