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,一经查实,立即删除!

相关文章

leetcode116填充每个节点的下一个右侧节点指针

思路&#xff1a; BFS&#xff0c;层次遍历的时候&#xff0c;我用的Queue存储每层的所有元素&#xff0c;因此我先用Node* node保存Q的第一个元素&#xff0c;然后把Q的第一个pop掉&#xff0c;然后让node的next指向pop之后的Q的第一个元素&#xff0c;就顺理成章完成了本题&a…

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

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

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

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

Level 2 行情数据存储处理

DolphinDB 处理 Level 2 行情数据实例 Level 2 高频行情数据包含大量有价值的信息&#xff0c;利用这些数据生成交易信号和获取收益已经成为量化研究中的一种主流策略。作为一个高性能时序数据库&#xff0c;DolphinDB 非常适合存储、处理 GB 级别甚至 PB 级别的海量数据集&…

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

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

抖音小店营业执照怎么办理?执照办理有哪些注意事项?

大家好&#xff0c;我是电商糖果 开店前我们需要办理一张执照&#xff0c;而新手开店基本都是个体执照。 所以这篇文章也主要讲个体执照的办理方法和注意事项。 抖音小店办理方法一共有三种。 第一种&#xff1a;自己去当地工商局办理 准备好法人身份证原件&#xff0c;复印…

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

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

Linux开发 -- 编写脚本

使用脚本可以提高工作效率、减少人为错误、简化复杂操作、增加系统自动化管理能力等&#xff0c;是 Linux 系统管理和开发中非常重要的工具之一。 1.常见指令 变量操作&#xff1a; &#xff1a;赋值操作符&#xff0c;用于给变量赋值。$&#xff1a;变量引用符号&#xff0c;…

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

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

【NLP10-fasttext工具】

了解fasttext工具的作用 了解fasttext工具的优势及其原因 掌握fasttext的安装方法 1、认识fasttext工具 1.1、作用&#xff1a; 进行文本分类 训练词向量 1.2、工具包优势 正如它的名字&#xff0c;在保持较高精度的情况下&#xff0c;快速的进行训练和预测是fasttext的…

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 …

社会规范和个人规范

世界有两套规范&#xff1a;社会规范和个人规范。 社会规范&#xff1a;友好&#xff0c;界限不明&#xff0c;不要求及时回报。 市场规范&#xff1a; 没有友情&#xff0c;没有爱情&#xff0c;没有小市民伤感&#xff0c;只有交易。 在传统经济学中&#xff0c;交易覆盖了…

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

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

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

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

企业HR怎么看待PMP证书?

企业HR在招聘和选拔人才时&#xff0c;往往会参考各种证书和资格来评估候选人的专业能力和素质。PMP&#xff08;Project Management Professional&#xff09;证书作为全球公认的项目管理专业人士认证&#xff0c;对于企业HR来说&#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…

基础小白快速入门web前端开发技术----------->htm基础

HTML的文档结构 HTML 文档以<html>标记开始&#xff0c;以</html>标记结束 文档类型声明&#xff08;Doctype&#xff09;&#xff1a;告知浏览器正在使用哪个HTML版本 <!DOCTYPE html>根元素&#xff08;Root element&#xff09;&#xff1a;通常是<h…