C语言中一维数组及二维数组的运用

1、int arr[] = {12,3,4,5,6};

int * p  = arr;

int * q = &arr[1];

其中arr是数组名,代表了整个数组的首元素地址,这个是一个常量,放在常量存储区,所以在给int*p赋值的时候可以不用带&,而下面的arr[1]则代表数组里的某一个元素,所以在赋值时要加上&

 有个例题:

下列运行结果

int main()
{int a[5] = { 1, 2, 3, 4, 5 };int *ptr = (int *)(&a + 1);printf( "%d,%d", *(a + 1), *(ptr - 1));return 0;
}

 解析:首先看main函数里的第二行,定义了一个整型指针指向了(int *)(&a+1),而&a是int(*)[5]类型,加1则跳过了一个int(*)[5]强制转换为(int *)赋给ptr,因此ptr指向数组的后面int(*)[5]的地址,也就是ptr指向了数组末尾后的(也就是a[4]的后面)第一个元素,

看第三行,*(a+1),没加&的a就相当于a[0]的地址,a+1就相当于往后移了一个位置,也就是到了a[1]的位置,故*(a+1)就是2,而ptr-1就是相当于ptr往后移了一个位置,ptr指向了a[4],也就是5。

2、a[3][3] = {1,2,3,4,5,6,7,8,9};

可以把数组看成如下图:

其中a代表二维数组的第一个元素的地址a[0]即a==&a[0],如果想把a的地址赋值给一个指针p,则需定义一个int (*p)[3] = a,因为&a[0]中a[0]代表了a[0][0],a[0][1],a[0][2],是一个行数组,所以得用一个指向三个长度(因为这一行有三个元素)的数组指针来存放这三个地址。

例题:

请写出以下程序输出结果并说明原因
#include <stdio.h>

int main(void)
{
    char *c[] = {"ENTER","NEW","POINT","FIRST"};
    char **cp[] = {c+3,c+2,c+1,c};
    char ***cpp = cp;
    printf("%s\n",**++cpp);
    printf("%s\n",*--*++cpp+3);
    printf("%s\n",cpp[-1][-1]+1);

    return 0;
}

解:首先,**++cpp等价于*(*(cpp = cpp+1)),此时cpp移动到了c+2的位置,而c+2又指向了“POINT”,所以第一个输出为POINT

*--*++cpp+3,因为双目运算符+的优先级比*和++及--低,所以先进行cpp = cpp+1运算,又因为经过上一步cpp指向了c+2,故这一次cpp指向了c+1的位置,*(cpp+1)也就是(c+1),为了更好的理解,现在我们可以把c+1看成b,*--(c+1)也就是*--b,也就是*(b=b-1)=*(c+1-1)=*(c)=(“ENTER”)(注意后面的ENTER只是指向了c[]指针数组的第一个元素,此时还是代表c[0]的地址,不过存放了ENTER的首地址也就是E),此时+3也就是往后移动三个元素,也就是ER,故输出ER

因为在二维数组中,数据是一维的,是线性排列,所以,cpp[-1]等于cpp向后移动一位,经过前两步,cpp已经指向了c+1,为了更好的理解我们可以先看一个例题:

我们定义一个arr[5][5]整型数组

0   1   2   3   4

5   6   7   8   9

10  11   12  13  14

15  16   17   18  19

20 21   22   23  24

用以下来输出 

  printf("a[ 1][ 0]=%2d  %p\n",a[1][0],&a[1][0]);
    printf("a[ 1][-1]=%2d  %p\n",a[1][-1],&a[1][-1]);
    printf("a[ 1][-2]=%2d  %p\n",a[1][-2],&a[1][-2]);

输出结果是 

    a[ 1][ 0]= 5  000000000062FDE4
    a[ 1][-1]= 4  000000000062FDE0
    a[ 1][-2]= 3  000000000062FDDC

也就是说明了二位数组是线性存储的,a[1][-1]中的[-1] 表示往后移一个单位,故虽然前面是[1]但是已经在第一行了,故上面那题cpp[-1][-1]也就等价于(*(cpp-1)-1)+1

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

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

相关文章

操作系统8:存储器的层次结构及程序的装入和链接

目录 1、存储器的层次结构 &#xff08;1&#xff09;多层结构的存储器系统 1.1 - 存储器的多层结构 1.2 - 可执行存储器 &#xff08;2&#xff09;主存储器与寄存器 2.1 - 主存储器 2.2 - 寄存器 &#xff08;3&#xff09;高速缓存和磁盘缓存 3.1 - 高速缓存 3.2 …

Tauri 提供界面 + 使用 Rust 实现连接远程 Linux 服务器、发送文件、执行命令

Tauri 提供界面 使用 Rust 实现连接远程 Linux 服务器、发送文件、执行命令 文章目录 Tauri 提供界面 使用 Rust 实现连接远程 Linux 服务器、发送文件、执行命令一、Tauri 概述二、界面预览三、代码参考1、main.rs2、App.vue3、Greet.vue4、依赖 一、Tauri 概述 Tauri 是一…

HummerRisk 配置 HTTPS访问

简介 HummerRisk 是开源的云原生安全平台&#xff0c;以非侵入的方式解决云原生的安全和治理问题。核心能力包括混合云的安全治理和云原生安全检测。 HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是一种通过加密和身份验证来保护网络通信安全的协议。它…

软件设计模式与体系结构-软件体系-数据流风格软件体系结构

二、数据流风格软件体系结构 概念 数据流系统的各软件组件在无数据到达时处于休眠状态&#xff0c;当有数据到达时&#xff0c;该软件组件被激活&#xff0c;开始对数据进行处理。数据流风格软件体系结构将整个软件系统看作由一系列作用在连续数据集合上的“变换”组成。数据…

第N4周:使用Word2vec实现文本分类

目录 二、数据预处理1.加载数据2.构建词典3.生成数据批次和迭代器 二、模型构建1.搭建模型2.初始化模型3.定义训练与评估函数 三、训练模型1.拆分数据集并运行模型2.测试指定数据 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&…

测试服务器CPU情况

要查看服务器的CPU情况&#xff0c;你可以使用 TOP 命令结合一些选项来执行相应的测试top 命令&#xff1a;运行 top 命令可以实时监视系统的各个进程和 CPU 使用情况在 top 命令的输出中&#xff0c;有几个重要的指标参数可以帮助你了解系统的 CPU 使用情况和进程信息。以下是…

Mac电脑如何与 Windows 用户共享文件?

在 Mac 上设置文件共享 选取苹果菜单 >“系统偏好设置”&#xff0c;然后点按“共享”。 选择“文件共享”复选框&#xff0c;然后点按“选项”。 选择“使用 SMB 来共享文件和文件夹”复选框。 在“Windows 文件共享”列表中&#xff0c;选择要与 Windows 用户共享文件的…

JavaWeb_瑞吉外卖_项目优化Day11-Mysql主从复制, Nginx

JavaWeb_瑞吉外卖_项目优化Day11-Mysql主从复制, Nginx Mysql主从复制介绍配置主库Master从库Slave 读写分离案例背景Sharding-JDBC介绍入门案例 Nginx概述介绍下载安装目录结构 命令配置文件结构具体应用部署静态资源反向代理负载均衡 来源 Mysql主从复制 介绍 MySQL主从复制…

数据结构--由遍历序列构造二叉树

数据结构–由遍历序列构造二叉树 不同二叉树的中序遍历序列 中序遍历:中序遍历 左 \color{red}左 左子树、 根 \color{purple}根 根结点、中序遍历 右 \color{green}右 右子树 中序遍历序列:BDCAE 结论 : 一个中序遍历序列可能对应多种二叉树形态 \color{green}结论:一个中序…

[NISACTF 2022]babyserialize(pop链构造与脚本编写详细教学)

目录 一、理清pop链并进行标注 二、如何编写相关脚本 三、过滤与绕过 1、waf的绕过 2、preg_match的绕过 做这道题作为pop链的构造很典型&#xff0c;也很有意思&#xff0c;因为还存在一些其他东西。 打开链接&#xff0c;这种很多类的PHP代码多半是需要构造pop链 一、理…

stm32_<一文通>_cubemx_freertos

文章目录 前言一、任务调度1.1 延时1.1.1 相对延时1.1.2 绝对延时 1.2 挂起和恢复1.2.1 cmsis的挂起和恢复函数1.2.2 freertos的挂起和恢复函数 1.3 删除1.3.1 cmsis的删除任务函数1.3.2 freertos的删除任务函数 二、Freertos任务与中断三、消息队列3.1 写入和读取一个数据3.2 …

什么是数据一致性

什么是数据一致性 数据一致性这个单词在平常开发中&#xff0c;或者各种文章中都能经常看见&#xff0c;我们常常听见什么东西数据不一致了&#xff0c;造成了一定的损失&#xff0c;赶快修复一下。但是很多同学对一致性具体代表什么意思&#xff0c;他有什么作用依然不是很了解…