C 练习实例77-指向指针的指针-二维数组

关于数组的一些操作

#include<stdio.h>
#include<stdio.h>
void fun(int b[],int length)
{for(int i=0;i<length;i++){printf("%d ",b[i]);}printf("\n");for(int i=0;i<length;i++){	//数组作为形参传递,传递的是指针,所以能够改变值b[i]++;}
}
int main()
{int a[5]={1,2,3,4,5};
//	int b[5]=a;  不合法,数组的本质是常量指针,不允许被修改
//	也就是说b指向了一片空间,这片空间是随机分配的,它一辈子只能指向那片空间fun(a,sizeof(a)/sizeof(int));for(int i=0;i<sizeof(a)/sizeof(int);i++){printf("%d ",a[i]);}printf("\n");return 0;
}

运行结果

1 2 3 4 5
2 3 4 5 6

指向指针的指针

代码 

#include<stdio.h>
int main()
{int a=100;int *p1=&a;int **p2=&p1;printf("&a=%p\n",&a);printf("p1=%p\n",p1);printf("*p2=%p\n",*p2);printf("a=%d\n",a);printf("*p1=%d\n",*p1);printf("**p2=%d\n",**p2);return 0;
}

 结果

&a=000000000065FE14
p1=000000000065FE14
*p2=000000000065FE14
a=100
*p1=100
**p2=100

二维数组

代码

#include<stdio.h>
int main()
{
//	要点:数组名可以当指针用,它的值就是首地址,它指向的就是数组首元素int b[3]={1,2,3};//一维数组printf("b=%p\n",b);//首地址printf("&b=%p\n",&b);//首地址printf("&b[0]=%p\n",&b[0]);//首地址printf("*b=%d\n",*b);//首地址可以取出首元素printf("b[0]=%d\n",b[0]);printf("\n");/*二维数组的每一行其实就是一个一维数组a[0]可以认为是第一行数组的数组名,也可以认为是指向第一行数组的指针a[0]的值实际上就是第一行数组的首地址以此类推,a[1]是第二行,a[2]是第三行......*///	{a[0],a[1],a[2]}也可以看作是一个一维数组,a是它的名,也可以看作是指针
//	a的值就是就是一维数组a[0]的首地址int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};//二维数组printf("a[0]=%p\n",a[0]);//第一行数组的首地址,也就是首地址printf("&a[0]=%p\n",&a[0]);//第一行数组的首地址,也就是首地址printf("*a=%p\n",*a);//第一行数组的首地址,也就是首地址printf("a=%p\n",a);//第一行数组的首地址,也就是首地址printf("&a=%p\n",&a);//第一行数组的首地址,也就是首地址printf("&a[0][0]=%p\n",&a[0][0]);//第一行数组的首地址printf("a[0][0]=%d\n",a[0][0]);//首元素printf("*a[0]=%d\n",*a[0]);//首地址可以取出首元素printf("**a=%d\n",**a);//首地址的首地址可以取出首元素-指针的指针return 0;
}

运行结果

b=000000000065FE14
&b=000000000065FE14
&b[0]=000000000065FE14
*b=1
b[0]=1a[0]=000000000065FDE0
&a[0]=000000000065FDE0
*a=000000000065FDE0
a=000000000065FDE0
&a=000000000065FDE0
&a[0][0]=000000000065FDE0
a[0][0]=0
*a[0]=0
**a=0

在一维数组中,a的值=&a的值=&a[0]的值,*a=a[0]

在二维数组中,&a=a=*a=a[0]=&a[0]=&a[0][0],a[0][0]=*a[0]=**a[0],有点绕哈,是不是和指向指针的指针有点像。

数组指针(指向数组的指针)

它的定义如下:

#include <stdio.h>
int main()
{int a[3]={1,2,3};int *p=a;printf("*p+0=%d\n",*p+0);printf("*p+1=%d\n",*p+1);printf("*p+2=%d\n",*p+2);
}

输出结果

*p+0=1
*p+1=2
*p+2=3

数组指针,就是指向数组的指针,它存放的是数组的首地址,每加1其实是加了一个int类型的字节长度。

指针数组

指针数组,就是数组的每个元素是指针类型的,存放的是地址值。

#include <stdio.h>
int main()
{int a=1;int b=2;int c=3;printf("%d,%d,%d\n",&a,&b,&c);int *array[3]={&a,&b,&c};
//int *->int型指针,array[3]->数组有3个元素,每个元素是int *型,即指向整形变量的指针类型printf("%d,%d,%d\n",array[0],array[1],array[2]);printf("%d,%d,%d\n",*array[0],*array[1],*array[2]);//*为取值运算符printf("%d\n",&array[0]);//(数组也有它自己的地址)printf("%d\n",array);//&array[0]=array=&arrayprintf("%d\n",&array);//&array[0]=array=&array//	int *p=array;××因为array是int *型的,所以我们要定义int *型的指针,才能指向这个数组int **p=array;//拆成3部分看容易理解,int *看作类型,*表示是int *类型的指针,p代表变量名//即指向指针的指针printf("%d,%d,%d\n",&array[0],&array[1],&array[2]);//(数组也有它自己的地址)printf("%d,%d,%d\n",p,p+1,p+2);//(通过指针拿到数组单元的地址)printf("%d,%d,%d\n",*(p+0),*(p+1),*(p+2));//(通过取值运算符*拿到数组单元的值)printf("%d,%d,%d\n",**(p+0),**(p+1),**(p+2));//(通过取值运算符*拿到数组单元的地址所指向的值)//在自己动手实验的过程中,我发现变量的内存分配好像是自顶向下,是递减规律
//而数组单元间的地址值是递增规律}

运行结果 

6684180,6684176,6684172
6684180,6684176,6684172
1,2,3
6684144
6684144
6684144
6684144,6684152,6684160
6684144,6684152,6684160
6684180,6684176,6684172
1,2,3

二维数组续

 

#include <stdio.h>
int main()
{int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};int *p0=a[0];//第一层首元地址int *p1=a[1];//第二层首元地址int *p2=a[2];//第三层首元地址printf("*p0=%d\n",*p0);printf("*p1=%d\n",*p1);printf("*p2=%d\n",*p2);printf("*a[0]=%d\n",*a[0]);printf("*a[1]=%d\n",*a[1]);printf("*a[2]=%d\n",*a[2]);int (*p)[4]=a;//p指向int[4],即指向4个int类型的连续空间,4*4=16Byteprintf("a[0]=%d\n",a[0]);printf("a[1]=%d\n",a[1]);printf("a[2]=%d\n",a[2]);printf("\n");printf("p0=%d\n",p0);printf("p1=%d\n",p1);printf("p2=%d\n",p2);printf("\n");printf("p+0=%d\n",p+0);//二维数组第一层printf("p+1=%d\n",p+1);//+1不是简单的加1,而是加到下一个16Byte的空间  第二层printf("p+2=%d\n",p+2);//二维数组第三层printf("\n");printf("*(*(p+0)+0)=%d\n",*(*(p+0)+0));printf("*(*(p+0)+0)=%d\n",*(*(p+1)+0));printf("*(*(p+0)+0)=%d\n",*(*(p+2)+0));printf("\n");//	因此遍历二维数组就有了两种方式
//	方式一for(int i=0;i<3;i++){	//最外层控制行for(int j=0;j<4;j++){	//内层控制列printf("%d ",a[i][j]);}printf("\n");}printf("\n");
//	方式二for(int i=0;i<3;i++){	//最外层控制行for(int j=0;j<4;j++){	//内层控制列printf("%d ",*(*(p+i)+j));}printf("\n");}
//	总结:c语言里的二维数组是连续空间,所以可以进行上述操作return 0;
}

运行 

*a[0]=0
*a[1]=4
*a[2]=8
a[0]=6684096
a[1]=6684112
a[2]=6684128p0=6684096
p1=6684112
p2=6684128p+0=6684096
p+1=6684112
p+2=6684128*(*(p+0)+0)=0
*(*(p+0)+0)=4
*(*(p+0)+0)=80 1 2 3
4 5 6 7
8 9 10 110 1 2 3
4 5 6 7
8 9 10 11

指针+字符串

#include <stdio.h>
int main()
{	//好好学习,天天向上。char *str1="好好学";char *str2="习,天";char *str3="天向上";char *str[3]={str1,str2,str3};printf("%s%s%s",str[0],str[1],str[2]);;return 0;
}

运行结果

好好学习,天天向上

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

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

相关文章

人工智能如何撬动新质生产力发展?

全国两会期间&#xff0c;“新质生产力”成为高频词&#xff0c;引发高度关注。新质生产力是由技术革命性突破、生产要素创新性配置、产业深度转型升级催生的当代先进生产力。而人工智能被视为形成新质生产力的重要引擎。 随着人工智能&#xff08;AI&#xff09;技术跨越奇点…

Python3+RIDE+RobotFramework自动化测试框架搭建

Python2.7已于2020年1月1日开始停用&#xff0c;之前RF做自动化都是基于Python2的版本。 没办法&#xff0c;跟随时代的脚步&#xff0c;我们也不得不升级以应用新的控件与功能。 升级麻烦&#xff0c;直接全新安装。 一、Python安装 最新版Python下载地址&#xff1a;http…

Python环境下基于注意力机制的小样本轴承故障诊断

传统的基于特征提取与分类相结合的轴承智能诊断算法&#xff0c;对信号处理要求很高的专家经验&#xff0c;既费时又缺乏通用性。基于深度学习的智能轴承故障诊断方由于具有强大的特征提取能力&#xff0c;避免了繁琐复杂的特征提取工作&#xff0c;但是大多数研究都是在标准数…

共谋企业出海新篇章纷享销客荣获数字中国企业峰会“卓越成果奖”

3月9日&#xff0c;2024数字中国企业峰会在杭州西湖中维香溢大酒店成功举办&#xff0c;众多数字化领域专家、知名企业 CIO 代表到场。峰会旨在推动数字化转型与创新发展&#xff0c;为企业出海和国际合作搭建交流与合作的平台。本次峰会的颁奖环节&#xff0c;纷享销客凭借其卓…

【已解决】MySQL:常用的除法运算+精度处理+除数为0处理

目录 问题现象&#xff1a; 问题分析&#xff1a; 拓展&#xff1a; 1、除法运算&#xff1a; 拓展&#xff1a;MySQL中常用的几种除法运算 1、取整除法 2、浮点数除法 3、取余除法 4、向上取整除法 5、向下取整除法 2、运算结果的精度处理 1.1、浮点数 1.2、总位数 1.3、…

android 怎么自定义view

首先了解view的绘制流程: 所以onmeasure ---测量view onlayout---确定view大小----》所以继承ViewGroup必须要重写onlayout,确定子view 而onDraw----是继承view时候需要操作的。 所以:自定义ViewGroup一般是利用现有的组件根据特定的布局方式来组成新的组件。 自定义Vi…

python打包时遇见第三方包有隐藏依赖或者出现依赖错误

使用pyinstaller 打包成exe 文件步骤&#xff1a; 1.创建虚拟环境&#xff0c;并激活虚拟环境 #创建虚拟环境 python -m venv myenv #激活虚拟环境&#xff08;windows&#xff09; myenv\Scripts\activate2.导出需要的依赖 pip freeze > requirements.txt 或者 pip list …

AutoCAD 2020:三维建模与渲染,设计未来的建筑蓝图

AutoCAD 2020是一款功能强大且广泛应用的计算机辅助设计软件&#xff0c;它以其卓越的性能和丰富的功能&#xff0c;满足了机械、建筑、家居、纺织等诸多行业的设计需求。以下是AutoCAD 2020的一些主要功能介绍&#xff1a; 保存和安装优化&#xff1a;AutoCAD 2020在性能上进…

观成科技-基于自适应学习的人工智能加密流量检测技术

1.前言 人工智能技术的广泛应用正在深刻改变我们的生活。在网络安全领域&#xff0c;基于机器学习的检测技术也应用在许多场景中。随着信息技术的迅猛发展和数字化转型的深入推进&#xff0c;加密技术逐渐成为保障网络安全和数据隐私的核心手段&#xff0c;而基于机器学习的检…

每日五道java面试题之mybatis篇(四)

目录&#xff1a; 第一题. 映射器#{}和${}的区别第二题. 模糊查询like语句该怎么写?第三题. 在mapper中如何传递多个参数?第四题. Mybatis如何执行批量操作第五题 MyBatis框架适用场景 第一题. 映射器#{}和${}的区别 #{}是占位符&#xff0c;预编译处理&#xff1b;${}是拼接…

windows 安装cuda 11.2过程记录

参考&#xff1a; https://blog.csdn.net/m0_45447650/article/details/123704930 https://zhuanlan.zhihu.com/p/99880204?from_voters_pagetrue 在显卡驱动被正确安装的前提下&#xff0c;在命令行里输入nvidia-smi.exe 下载CUDA Toolkit: https://developer.nvidia.com/…

CrossEntropyLoss 和NLLLoss的关系

交叉熵损失在做一件什么事? 看公式: x是预测(不需要softmax归一化),y是label, N是batch维度的数量,交叉熵损失,干了三件事. 1. 对输入在类别维度求softmax 2. 多softmax后的数,求log 3. 对(样本数, 类别数)为shape的tensor计算NLLLoss. 其中,NLLloss做的就是log取负, 和o…

java入门 - 规范你的代码注释

java基础语法-代码注释 注释只是为了提高可读性&#xff0c;不会被计算机编译。代码注释是架起程序设计者与程序阅读者之间的通信桥梁,最大限度的提高团队开发合作效率。也是程序代码可维护性的重要环节之一。 开发中注释可以分为三种方式&#xff1a; 行注释块注释类/方法注释…

Linux 大页内存 Huge Pages 虚拟内存

Linux 大页内存 Huge Pages 虚拟内存 - 秋来叶黄 - 博客园 (cnblogs.com) Linux为什么要有大页内存&#xff1f;为什么DPDK必须要设置大页内存&#xff1f;这都是由系统架构决定的。一开始为了解决一个问题&#xff0c;设计了对应的方案&#xff0c;随着事物的发展&#xff0c…

Splitpanes拆分窗格插件使用

目录 基本用法 纵向排列 遍历渲染 动态拆分宽度 项目开发中用到了拆分窗格(就是下面的效果&#xff0c;可以拆分网页&#xff0c;我们项目通常都是用左右两块拆分&#xff0c;可以通过拖动图标进行左右拖动)&#xff0c;于是就发现了一个很好用的插件&#xff1a;Splitpane…

上位机图像处理和嵌入式模块部署(qmacvisual畸变矫正)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 大部分同学在开始做计算机图像的时候&#xff0c;是没有意识到畸变矫正这个问题的。当然不仅仅是畸变矫正&#xff0c;很多同学还会忽略光源的问题…

python异常:Exception、BaseException接收异常,并打印异常信息msg

except IOEerror 只能接收到 IO 类型的错误&#xff0c;对于抛出的 NameError 类型的错误&#xff0c;在 Python 中所有的异常类都继承 Exception&#xff0c;所以我们可以使用它来接收所有的异常。 1.Exception接收异常 源码&#xff1a; open("test1.py",r) pr…

4款智能文章生成器推荐,为你创作文章效率高

智能文章生成器的出现为创作者带来了很多方便&#xff0c;尤其是在当今信息爆炸的时代&#xff0c;内容创作已经成为许多人日常工作中不可或缺的一部分。无论是博客、新闻报道、营销文案还是学术论文&#xff0c;高质量的文章往往需要耗费大量的时间和精力来撰写。但有了智能文…

固态硬盘格式化后怎么恢复 固态硬盘被格式化后如何恢复

你知道吗,固态硬盘被格式化后,还有一线生机可以让你把数据找回来!固态硬盘被格式化后如何恢复?不要慌张,我们来一步一步地看看该怎么做。首先,你需要知道格式化并不是真正意义上的删除数据,而是把硬盘上的文件系统清空,让数据变得不可见。所以,只要你没有在格式化后往…

Linux —— 定时任务(sleep、crontab、at)

目录 1、使用 sleep 来完成定时任务 2、使用 crontab 来进行定时任务 3、使用 at 来执行单次的定时任务 1、使用 sleep 来完成定时任务 sleep n 等待 n 秒再继续往后执行 usleep n 等待 n 微秒再继续往后执行&#xff08;1 秒等于 1 000 000 微秒&#xf…