数组与指针

博客内容:数组与指针


文章目录

  • 一、 数组?指针?
    • 1.区别与联系
      • 大小
      • 赋值
      • 存储位置
  • 二、指针数组、数组指针?
  • 二维数组和二级指针
  • &数组名与数组的区别
  • 总结


一、 数组?指针?

数组

相同类型数据的集合

指针

指针是内存地址,指针变量是保存指针的变量。一般我们使用的都是指针变量。

1.区别与联系

大小

对于数组来说可以在定义时控制大小,也可以不固定大小。使用关键字sizeof来计算。

int main()
{int arr[5];int brr[] = { 1,2,3,4,5 };printf("%d \n",sizeof(arr));printf("%d ", sizeof(brr));return 0;
}

在这里插入图片描述
对于指针只关心机器,在32位机器下大小为4字节,64位下为8字节

int main()
{int* ptr;char* srt;printf("%d \n", sizeof(ptr));printf("%d \n", sizeof(srt));return 0;
}

在这里插入图片描述在这里插入图片描述

赋值

指针只要类相同就可以进行赋值,数组需要一个一个进行赋值。

存储位置

数组存储在栈上,或者使用内存函数(malloc)在对上开辟空间。
指针本身就是一个变量,存放指针的也是一个变量,所以存储位置不确定。

二、指针数组、数组指针?

指针数组

本质是数组,数组中每个元素的类型是指针

int* arr[10]//存储的10个int类型的指针

数组指针

是指针,是一个指向数组的数组的指针。

int*p)arr[10];//这是指针,指向的是一个数组,数组中有10个int类型。

如果查看运算符优先级表,可以看出对于[]的优先级高于*。所以使用()来让*优先级提高。这样就方便记忆了。
同样类似的还有函数指针,

void Add(int a,int b)
{printf("%d\n", a + b);
}
int main()
{void(*fun)(int, int) = &Add;Add(1, 2);fun(1,2);(*fun)(1, 2);return 0;
}

在这里插入图片描述

函数指针在使用时可以解引用,也可以直接使用指针。

二维数组和二级指针

二维数组
在这里插入图片描述
对于二维数组看做是一个数组中存储了一个数组。对于二维数组的表示是行可不写,但是列必须有。初始化时不可以间断。

int arr1[10][];

在这里插入图片描述

	int arr2[][2] = { {1,2},{},{2,3} };

在这里插入图片描述
二级指针就是指向指针的指针。

int main()
{int i = 10;int* p = &i;printf("%d\n",*p);int** q =& p;printf("%d\n", (*(*q)));return 0;
}

在这里插入图片描述
当然数组在传参时可以使用指针来作为形参。

&数组名与数组的区别

int main()
{int arr[10];printf("%p\n", arr);printf("%p\n", arr+1);printf("%p\n", &arr);printf("%p\n", &arr+1);return 0;
}

在这里插入图片描述
&是对整个数组的地址,数组名代表首元素位置。对于数组这样连续的空间,数组使用数组来记录开始位置。所以这就为什同样是+1,但是内存地址的差距这么大原因。


总结

使用数组和指针的转换对于我们编程来说会变得更加灵活,指针使用到位,会让数组代码看起来更加的优雅。

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

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

相关文章

TortoiseGit 入门指南11:还原与重置

Git 就像个时光机器,能让我们还原到任何提交。 还原未提交的更改 假如我们在查看一个干净的代码仓库,干净意味着工作区中的文件保持着最后一次提交的状态,没有修改。在查看的过程中,我们有意或无意的修改了工作区中的文件&#…

pwm呼吸灯

文章目录 一、呼吸灯二、代码实现三、引脚分配 一、呼吸灯 呼吸灯是指灯光在微电脑的控制之下完成由亮到暗的逐渐变化,使用开发板上的四个led灯实现1s间隔的呼吸灯。 二、代码实现 c module pwm_led( input clk ,input rst_n ,output reg [3:0] led ); …

TCP/IP网络编程 第十二章:I/O复用

基于I/O复用的服务器端 多进程服务器端的缺点和解决方法 为了构建并发服务器,只要有客户端连接请求就会创建新进程。这的确是实际操作中采用的种方案,但并非十全十美,因为创建进程时需要付出极大代价。这需要大量的运算和内存空间&#xff…

FPGA adrv9002 4收4发板卡,支持NVME SATA EMMC 光口 FMC

板卡采用ADI 射频直采芯片ADRV9002 ,支持4收4发支持外部本振 跳频 同时支持4X 10G光口对外传输,FMC扩展 。同时支持4X NVME接口,可以实时流盘,备份一路SAT A接口,板卡同时预留了EMMC,可以PS PL选通访问&…

javascript中使用class和prototype的区别

javascript中使用class和prototype的区别 本文将介绍在 JavaScript 何时使用class以及何时使用prototype。 prototype 首先先介绍一下prototype的概念,在Javascript中,所有的对象都从原型中继承属性和方法。 function Car(brand, vinNumber) {this.b…

音视频H265编码; Socket通信实现N对N连接代码示例

H.265编码和Socket通信是两个不同的概念,它们分别涉及视频编码和网络通信。在实现N对N连接时,您可以将它们结合起来,但要注意每个方面的具体实现。 H.265编码(视频编码): H.265编码涉及将视频数据进行压缩…

typescript manual

这里写目录标题 throw new Error在浏览器中调试Json定义类型定义数组 functionNamed functionanonymous function Axios经典片段 错误及解决ref valuebecause it is a constantAPI 和 客户端定义的数据结构不一样ServerClient throw new Error throw new Error(“Get data err…

Android应用启动全流程分析(源码深度剖析)

作者:努比亚技术团队 源码来源:努比亚技术团队 1.前言 从用户手指点击桌面上的应用图标到屏幕上显示出应用主Activity界面而完成应用启动,快的话往往都不需要一秒钟,但是这整个过程却是十分复杂的,其中涉及了Android系…

ngsoc使用指南

和威胁告警差不多。 ngsoc是以资产为核心,以安全事件为管理的关键流程,建立一套威胁检测,相应,预测,和持续监控分析,一体化的监控与相应平台。 和天眼的区别:会把天眼的告警,其他安…

基于阿里云微信小程序语音识别

页面效果 其中采用阿里云语音识别&#xff1a;阿里云一句话语音识别 语音识别页面 <template><view><view class"chat_list"><view v-for"v in chatList" :class"v.type right ? type_right : type_left"><chat …

React和Vue生命周期

主要就是命名不同 目录 React 组件挂载 挂载前constructor() 挂载时render() 挂载后componentDidMount()&#xff1a;初始化节点 更新 更新时render()&#xff1a;prop/state改变 更新后componentDidUpdate() 卸载 卸载前componentWillUnmount()&#xff1a;清理 V…

Microsoft Outlook如何定时发送邮件

点击New Emai 选择Options→Delay Delivery→Do not deliver before→Close