25.数组指针取*,指针和函数的关系,指针作为函数的参数

news2025/1/18 11:43:49

数组指针取*

数组指针取*,并不是取值的意思,而是指针的类型发生变化;

  • 一维数组指针取*,结果为它指向的一维数组第0个元素的地址,它们还是指向同一个地方。
  • 二维数组指针取*,结果为一维数组指针,他们还是指向同一个地方。
  • 三维数组取*,结果为二维数组,他们还是指向同一个地方。
#include<stdio.h>
int main()
{
	int a[3][5];
	int(*p)[5];
	p = a;
	printf("a=%p\n", a);//a是数组中第0个一维数组的首地址,是个一维数组指针
	printf("a+1=%p\n", a + 1);
	printf("*a=%p\n", *a);
	printf("*a+1=%p\n", *a + 1);//*a+1是&a[0][1]
	printf("---------------------------------------\n");
	printf("p=%p\n", p);
	printf("p+1=%p\n", p + 1);
	printf("*p=%p\n", *p);
	printf("*p+1=%p\n", *p + 1);
	return 0;
}

在这里插入图片描述

指针和函数的关系

1.指针作为函数的参数

可以给函数传一个整型,字符型,浮点型,地址
例如:
int num;
scanf(“%d”,&num);

(1)传数值

#include<stdio.h>
void swap(int x, int y)
{
	int temp;
	temp = x;
	x = y;
	y = temp;
}
int main()
{
	int a = 10, b = 20;
	swap(a, b);
	printf("a=%d\nb=%d\n", a, b);
	return 0;
}

在这里插入图片描述
实参:调用函数时传的数据。
形参:定义被调函数,函数名后面括号里的数据。
结论:给被调函数传数值,只能改变被调函数形参的值,不能改变主调函数实参的值。

(2)传地址

#include<stdio.h>
void swap(int* p1, int* p2)
{
	int temp;
	temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}
int main()
{
	int a = 10, b = 20;
	swap(&a, &b);
	printf("a=%d\nb=%d\n", a, b);
	return;
}

在这里插入图片描述
结论:调用函数的时候传变量的地址,在被调函数中通过*+地址来改变主调函数中变量的值。

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

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

#include<stdio.h>
void fun(char** q)
{
	*q = "hello kitty";
}
int main()
{
	char* p = "hello world";
	fun(&p);
	printf("p=%s\n", p);
	return 0;
}

在这里插入图片描述
要想改变主调函数中变量的值,必须传变量的地址,而且还得通过、*+地址去赋值。无论这个变量是什么类型的。

(3)给函数传数组

给函数传数组的时候,没法将函数的内容作为整体传进去。
只能传数组名进去,数组名就是数组的首地址,即只能把数组的地址传进去。

传一维数组的地址
#include<stdio.h>
void fun(int p[])//等于void fun(int* p)
{
	printf("sizeof(p)=%d\n", sizeof(p));
	printf("p[2]=%d\n", p[2]);
	*(p + 3) = 100;

}
int main()
{
	int a[10] = { 1,2,3,4,5,6,7,8,9,0 };
	fun(a);
	printf("a[3]=%d\n", a[3]);
	return 0;
}

在这里插入图片描述

传二维数组的地址
#include<stdio.h>
void fun(int p[][4],int x,int y)//等于void fun(int(*p)[4], int x, int y)
{ 
	int i, j;
	printf("p[1][2]=%d\n", p[1][2]);
	printf("sizeof(p)=%d\n", sizeof(p));
	p[0][1] = 100;
	for (i = 0; i < x; i++)
	{
		for (j = 0; j < y; j++)
		{
			printf("%d ", p[i][j]);
		}
		printf("\n");
	}
}
int main()
{
	int a[3][4] = {
		{1,2,3,4},
		{5,6,7,8},
		{9,10,11,12}
	};
	fun(a, 3, 4);
	printf("a[0][1]=%d\n", a[0][1]);
	return 0;
}

在这里插入图片描述

传指针数组
#include<stdio.h>
void fun(char* q[],int x)//void fun(char** q, int x)
{
	int i;
	printf("sizeof(q)=%d\n", sizeof(q));
	for(i=0;i<x;i++)
	{
		printf("q[%d]=%s\n",i, q[i]);
	}
}
int main()
{
	char* p[3] = { "hello","world","kitty" };//p[0] p[1] p[2]是char*
	fun(p,3);//p就是 &p[0] 是char**
	return 0;
}

在这里插入图片描述

2.指针作为函数的返回值

3.指针保存函数的地址

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

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

相关文章

Excel实战 第1章 数据处理

目录1 数据规范2. 导入数据3. 数据清洗3.1 重复数据处理3.2 缺失数据处理3.3 空格数据处理1 数据规范 2. 导入数据 3. 数据清洗 3.1 重复数据处理 数据透视表法&#xff08;首选&#xff09; 选中A、B两列&#xff0c;点击【插入】–》【数据透视表】 把号码拉到【行】&…

LeetCode 207. 课程表

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 207. 课程表&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名称 LeetCode 207. …

图表控件LightningChart.NET 系列教程(六):许可证管理介绍(下)

LightningChart.NET SDK 是一款高性能数据可视化插件工具&#xff0c;由数据可视化软件组件和工具类组成&#xff0c;可支持基于 Windows 的用户界面框架&#xff08;Windows Presentation Foundation&#xff09;、Windows 通用应用平台&#xff08;Universal Windows Platfor…

Docker面试题(史上最全 + 持续更新)

专题37&#xff1a;Docker面试题&#xff08;史上最全、定期更新&#xff09; 本文版本说明&#xff1a;V26 《尼恩面试宝典》升级的规划为&#xff1a; 后续基本上&#xff0c;每一个月&#xff0c;都会发布一次&#xff0c;最新版本&#xff0c;可以联系构师尼恩获取&…

VALL-E:Neural Codec Language Models are Zero-Shot Text to Speech Synthesizers

文章目录NLP中Bert的进展历史word embeddingELMOGPTBertAudioLM: a Language Modeling Approach to Audio Generationabstractintrorelated workVALL-E:Neural Codec Language Models are Zero-Shot Text to Speech Synthesizersabstractspeech quantizationtraining:condition…

程序的机器级表示part2——访问信息

目录 1. 整数寄存器 2. 操作数指示符与寻址模式 3. 数据传送指令 4. 压入和弹出栈数据 1. 整数寄存器 一个x86-64的CPU包含一组16个存储64位值的通用目的寄存器(general-purpose registers) 整型寄存器x86-64的CPU是64位的&#xff0c;因此相应的寄存器长度与机器字长(数据…

基于matlab实现的水果识别系统+源码+代码注释

水果识别 摘要&#xff1a; 本项目针对多种常见水果混合的图像&#xff0c;利用 Matlab 软件&#xff0c;对水果的识别进行研究。根据水果和背景的差别选取阈值&#xff0c;对去噪增强对比度后的图像进行二值化处理。再对图像进行边缘检测&#xff0c;选定连通区域&#xff0…

仅需一个注解,实现springboot项目中的隐私数据脱敏

文章参考&#xff1a; 仅是为了方便查看&#xff0c;因此在此记录一下​​​​​​​ 目录 1. 创建隐私数据类型枚举&#xff1a;PrivacyTypeEnum 2. 创建自定义隐私注解&#xff1a;PrivacyEncrypt 3. 创建自定义序列化器&#xff1a;PrivacySerializer 4. 隐私数据隐藏工…

高德地图开发之地图配置及vue上初始化创建地图

开门见山地说&#xff0c;现如今地图相关的开发业务在工作中越来越常见&#xff0c;目前市面上主流的地图开发还是以百度和高德为主&#xff0c;今天就来讲一下高德地图的配置和在vue上的初始化创建&#xff0c;帮助大家更好更快的了解高德地图开发相关的内容。 一. 注册地图 …

Python协程的四种实现方式

今天继续给大家介绍Python关知识&#xff0c;本文主要内容是Python协程的四种实现方式。 一、yield关键字实现方式 以yield关键字方式实现协程代码如下所示&#xff1a; def fun1():yield 1yield from fun2()yield 2def fun2():yield 3yield 4f1fun1() for item in f1:print…

steam搬砖项目靠谱吗?怎么样?

Steam搬砖’通俗来讲&#xff1a;小白都可以轻松上手&#xff0c;不需要会玩游戏&#xff0c;项目就是利用低价美金充值卡&#xff0c;从国外Steam平台购买CS:GO游戏装备回来&#xff0c;在国内网易BUFF平台售卖&#xff0c;低买高卖&#xff0c;产生利润的一个项目 首先&…

javascript实现版本号自增打包vue写入版本号

文章目录Preface代码方法一&#xff1a;兼容多长版本号。如&#xff1a;1.0.0.0.0.0方法二&#xff1a;只针对3位版本号打包时写入版本号Preface 前段时间出差去帮忙别的项目&#xff0c;项目中有前端更新提醒用户更新。 更新提示是放在了axios请求中。 这个需求是别人做的&…

再学C语言34:数组

数组&#xff08;array&#xff09;由一系列类型相同的元素构成 数组的声明&#xff1a;包括数组元素的数目和元素的类型&#xff0c;编译器根据这些信息创建合数的数组&#xff0c;数组元素可以具有同普通变量一样的类型&#xff1a; int main(void) {int a[5]; // 包含5…

ESP32-C3 迷你智能语音照明

一、概述二、硬件原理图设计三、硬件PCB软件设计四、软件设计五、结构设计六、总结一、概述本设计是使用ESP32-C3芯片&#xff0c;结合TP4057锂电池充电管理芯片、SIQ-02FVS3旋转编码器、离线语音识别模块、无源蜂鸣器、TYPE-C接口设计的一款迷你智能照明产品。功能特点&#x…

vue组件传值方式有哪些

Vue 作为一个轻量级的前端框架&#xff0c;核心两大特性就是响应式编程和组件化。 本文针对组件之间传值做详细讲解。 Vue就是由一个一个的组件构成的&#xff0c;组件化是它的精髓&#xff0c;也是最强大的功能之一。而组件实例的作用域是相互独立的&#xff0c;这就意味着不…

priority_queue 接口使用(仿函数、函数指针解决优先级队列存放自定义类型元素、指针类型元素)

一、priority_queue 优先队列本质就是 堆 堆&#xff1a; 完全二叉树&#xff0c;任意结点比其孩子结点小->小根堆, 任意结点比其孩子结点大->大根堆, 头文件包含&#xff1a;#include<queue> 二、优先级队列的模板参数列表&#xff1a; template <class …

钓鱼邮件有哪些特征?

钓鱼邮件以其极具迷惑的特性&#xff0c;让很多人都上当受骗。一般的钓鱼邮件都有哪些特征呢&#xff1f; 1、一般像邮件中带有链接很可能是钓鱼邮件&#xff0c;收到不明邮件不要打开&#xff0c;更不能点击不明链接。 2、邮件中携带可疑附件&#xff0c;并且邮件正文具有引导…

Unity——新输入系统Input System

1.安装 安装&#xff1a; 直接到包管理器Window > Package Manager安装即可&#xff0c;安装后提示需要重启&#xff0c;重启后即可使用。 注意&#xff1a; 在Project Settings中的Player设置里将Active Input Handling设置为Input System。 需要将默认场景中的EventSyst…

线程安全☞有序性

什么是有序性&#xff1f; 在开发中&#xff0c;我们通常按照从上到下的顺序编写程序指令&#xff0c;并且希望cpu和编译器按照我们预先编写的顺序去执。但往往cpu和编译器为了提高性能、优化指令的执行顺序&#xff0c;会将我们编写好的程序指令进行重排序。 此时如果是在单…

如何将as代码上传到Gitee

一、Git的安装 1.这个直接到官网上下载&#xff0c;不多说了。Git - Downloads (git-scm.com) 2.在AS中添加Git的位置 二、AS中Gitee插件的安装 ⒈点击File中的Settings 2.安装插件 三.Gitee中账号的注册以及相关操作 1.注册账号 2.新建仓库 3. 在插件中注册Gitee账号 注…