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]=1

a[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=&array
	printf("%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=16Byte
	printf("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]=6684128

p0=6684096
p1=6684112
p2=6684128

p+0=6684096
p+1=6684112
p+2=6684128

*(*(p+0)+0)=0
*(*(p+0)+0)=4
*(*(p+0)+0)=8

0 1 2 3
4 5 6 7
8 9 10 11

0 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;
}

运行结果

好好学习,天天向上

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

生成单一c段或者连续c段范围内的所有ip地址+生成范围内C段脚本

1. 背景 马上有电子政务外网攻防演练要处理ip 2. 脚本1 生成c段和连续c段所有ip地址.py 用处&#xff1a;生成单一c段或者连续c段范围内的所有ip地址。 用法&#xff1a;ipc.txt 放入 ip段或者两个ip段范围&#xff1a;如&#xff1a; 192.168.3.0/24 172.16.1.0/24-1…

Java基础-集合_上

文章目录 1.基本介绍2.集合的框架体系&#xff08;单列、双列&#xff09;单列集合双列集合比较 3.Collection接口和常用方法1.Collection接口实现类的特点2.常用方法&#xff08;使用ArrayList演示&#xff09;代码结果 3.迭代器遍历基本介绍代码结果 4.增强for循环遍历代码结…

【JAVA基础】算法与集合

1 查找 1.1 二分查找 public class Main {public static void main(String[] args) throws IOException, CloneNotSupportedException, ParseException { //数组必须有序int[] arr{1,2,4,5,6,24,123};System.out.println(binarySearch(arr,123));//6}public static int bina…

Docker Compose基本配置及使用笔记

Docker Compose基本配置及使用笔记 简介 Docker Compose 是一个用于定义和运行多个 Docker 容器应用程序的工具。它使用 YAML 文件来配置应用程序的服务&#xff0c;并通过简单的命令集管理这些服务的生命周期。 1.步骤1 代码如下&#xff1a;docker-compose.yml放在虚拟机roo…

vite打包时发布时,放在服务器的二级目录中

方式一 hash模式 如果我们的站点根目录为 public , 我们访问的时候使用的是 http://www.abc.com/ 访问到了站点的根目当&#xff0c;现在我们要访问 http://www.abc.com/mysite/#/ 配置如下 修改 vite.config.js base:“/mysite/” 修改 router中的配置 上面的步骤完成&…

【网站项目】320社区物业管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

C#创建第一个PIESDK模版的项目

目录 环境配置创建项目方式 环境配置 1软件安装 通过安装光盘或者U盘等介质读取PIE软件的安装程序和使用文档。程序安装过程比较简单&#xff0c;软件本身不借助与任何第三方程序&#xff0c;直接双击安装程序【PIESDK.Net_V6.3_Windows_X64.exe】安装文件&#xff0c;即可安装…

总要做一回书里的国风少女吧,女儿的新中式套装美出新高度了~

超有质感的新中式国风短袖 采用经典立领设计 活里内衬柔软舒适 搭配浅色系马面裙 如书中温婉气质的千金小姐~

HTML万字学习总结

html文本标签特殊符号图片音频与视频超链接表单列表表格语义标签(布局) html文本标签 标签简介<html></html>根目录<head></head>规定文档相关的配置信息&#xff08;元数据<body></body>元素表示文档的内容<meta></meta>表示…

Gatling压力测试Springboot项目

Gatling压力测试Springboot项目 一、指定Java Spring 项目作为测试项二、下载Gatling三、配置测试代码四、打开bin目录下的gatling.bat文件进行测试 一、指定Java Spring 项目作为测试项 这里给出一个简单的示例&#xff1a;代码链接 下载maven依赖以后在8080端口运行这个项目…

初识进程状态

&#x1f30e;进程状态【上】 文章目录&#xff1a; 进程状态 发现进程的状态 运行队列 进程排队 进程状态的表述       状态在代码中的表示       运行状态       阻塞状态       挂起状态 总结 前言&#xff1a; 为了搞明白正在运行的进程是什么意思…

计算机网络(7)----应用层

目录 一.应用层的基本概念 1.应用层的基本概述 2.网络应用模型 &#xff08;1&#xff09;客户/服务器模型 &#xff08;2&#xff09;P2P模型 二.应用程序相关 1.DNS系统 &#xff08;1&#xff09;域名与域名服务器 &#xff08;2&#xff09;域名解析过程&#xff…

Java Web项目—餐饮管理系统Day05-菜品管理

文章目录 1. 表结构与菜品展示页面2. 菜品的分类选择3. 图片的上传与下载4. 新增菜品5. 分页展示菜品6. 修改菜品6-1. 菜品信息回显6-1. 菜品信息更新 开始进行 Dish 菜品管理相关的开发. 该表包含一个图片字段, 需要上传图片以及图片回显的业务. 另外, 每个菜品可能包含多个口…

SpringBoot(异常处理)

SpringBoot&#xff08;异常处理&#xff09; 1.基本介绍 2.debug异常处理机制 1.找到 DefaultErrorViewResolver 2.下断点 3.debug启动&#xff0c;浏览器输出一个不存在的页面 4.第一次查找 error/404 1.查看目前要找的视图名 2.准备去查找资源 3.准备从四个默认存放静态资…

测试环境搭建整套大数据系统(十一:docker部署superset,无密码登录嵌入html,http改为https)

一&#xff1a;安装docker 参考文档 https://blog.csdn.net/weixin_43446246/article/details/136554243 二&#xff1a;安装superset 下载镜像。 拉取镜像&#xff08;docker pull amancevice/superset&#xff09; 查看镜像是否下载完成&#xff08;docker images&#xf…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:RichText)

富文本组件&#xff0c;解析并显示HTML格式文本。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。该组件无法根据内容自适应设置宽高属性&#xff0c;需要开发者设置显示布局。 子组件 不包含子组…

广度优先算法(一篇文章讲透)

目录 引言 一、算法概述 二、算法步骤 1 初始化 2 循环处理 三、算法应用 1 图的最短路径问题 2 网络爬虫 3 社交网络分析 4 游戏路径搜索 事例 四、算法特点与性能 五、性能优化 1 剪枝策略&#xff1a; 2 使用高效的数据结构&#xff1a; 3 并行化处理&#…

Machine Vision Technology:Lecture6 Blob detection斑点检测

Machine Vision Technology&#xff1a;Lecture6 Blob detection斑点检测 Blob detectionAchieving scale covarianceRecall&#xff1a;Edge detectionScale selectionBlob detection in 2DCharacteristic scale特征尺度Scale-space blob detectorEfficient implementation&am…

webconfig-boot项目说明

1、前言 最近利用空余时间写了一个项目webconfig-boot 。该项目主要配置了web项目常用的一些配置&#xff0c;如统一参数校验、统一异常捕获、统一日期的处理、常用过滤器、常用注解等。引入依赖接口完成常规的web配置。 这里也是总结了笔者在项目开发中遇到的一些常用的配置…

C语言葵花宝典之——文件操作

前言&#xff1a; 在之前的学习中&#xff0c;我们所写的C语言程序总是在运行结束之后&#xff0c;就会自动销毁&#xff0c;那如果我们想将一个结果进行长期存储应该如何操作呢&#xff1f;这时候就需要我们用文件来操作。 目录 1、什么是文件&#xff1f; 1.1 程序文件 1.2…