C语言指针4

1.

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
	int a = 10;
	int* p = &a;//一级指针
	int** pp = &p;//二级指针
	return 0;
}

上述代码中p的类型是int*

pp的类型是int**

2.int* arr[5];

数组arr的每个元素是整形指针

3.定义一个变量时,去掉变量名,剩下的就是变量的类型

4.用二级指针模拟二维数组:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
	int arr1[5] = { 1,2,3,4,5 };//5列
	int arr2[5] = { 2,3,4,5,6 };//5列
	int arr3[5] = { 3,4,5,6,7 };//5列
	int* arr[] = { arr1,arr2,arr3 };
	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 5; j++)
		{
			printf("%d ", *(arr[i] + j));
			printf("%d ", arr[i][j]);
			//上述两行代码等效
			//因为arr[i][j] == *(arr + i)[j] == *(*(arr + i) + j)
		}
		printf("\n");
	}

	return 0;
}

5.char* p = "abcdef";

p存放的是首字符a的地址

6.可以把字符串想象为一个字符数组,但是这个数组是不能被修改的.

当常量字符串出现在表达式中的时候,他的值是第一个字符的地址.

例:

printf("%c", "abcdef"[3]);

char* p = "abcdef";

打印的是d,而且p[3] == "abcdef"[3];

7."abcdef" + 3拿到的是'd'的地址

8.数组指针和指针数组的区别示例:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int(*pa)[10] = &arr;//pa的类型是int(*)[10],p是一个指针,指向的是具有10个元素且每个元素的类型是int的数组
	int a = 10;
	int b = 20;
	int c = 10;
	int* p[3] = { &a,&b,&c };//pa的类型是int* [10],p是具有10个元素且每个元素的类型是int*的数组

	return 0;
}

9.

int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//&arr 的类型是int (*)[10]  

10.*p == arr;

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int(*p)[10] = &arr;
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++)
	{
		printf("%d", arr[i]);
		printf("%d", (*p)[i]);
		//上述两行代码等效
		//因为p == &arr
		//所以*p == *&arr == arr
	}
	return 0;
}

11.数组名都是首元素的地址,二维数组也不例外

12.二维数组传参传过去的也是首元素的地址,那么就可以用数组指针来接受那个一维数组,这也就是二维数组传参的本质

13.二维数组解引用一次的的话是找到了一维数组,而此时一维数组是该一维数组的数组名,即该数组首元素的地址,再对它进行解引用就拿到了某个数据

14.可以这样再函数内部查看主函数内部的数组

arr,长度

例:

15.int (*)[10] == int [10]*

16.若parr是数组指针,则parr里面存的是这个数组的地址,解引用拿到的是首元素的地址

17.函数名同时也是函数名的地址,&函数名也一样

18.

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

void print(int arr[3][5], int r, int c)
{
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	} 
}

int main()
{
	void(*p)(int[3][5], int, int) = &print;
	return 0;
}

上述的p是函数指针变量

而int*p(int[3][5], int, int);是函数的声明

pf == print

*pf == print

上述的p也可以这样初始化:

void(*p)(int[3][5], int, int) = print;

19.使用函数指针的例子:转移表的创建:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

void menu()
{
	printf("***********************\n");
	printf("*****1.Add   2.Sub*****\n");
	printf("*****3.Mul   4.Div*****\n");
	printf("*****0.exit       *****\n");
	printf("***********************\n");
}

int Add(int x, int y)
{
	return x + y;
}

int Sub(int x, int y)
{
	return x - y;
}

int Mul(int x, int y)
{
	return x * y;
}

int Div(int x, int y)
{
	//x = (float)x;
	return x / y;
}

int cal(int x, int y, int(*p)(int, int))
{
	return p(x, y);
}


int main()
{
	//函数指针数组
	int(*p[5])(int, int) = { 0,Add,Sub,Mul,Div };//重点!!!
	int input = 1;
	menu();
	scanf("%d", &input);
	while (input != 0)
	{
		if (input <= 4)
		{
			int a = 0;
			int b = 0;
			printf("请输入两个数:\n");
			scanf("%d %d", &a, &b);
			printf("%d\n", cal(a, b, p[input]));
		}
		else
		{
			printf("输入错误!请重新输入\n");
		}
		menu();
		scanf("%d", &input);
	}



	return 0;
}

20.(*(void (*)())0)();是调用地址为0的函数

21.void  (* signal(int, void(*)(int) ) )(int);

这是一个函数的声明,函数名是signal,参数类型是(int, void(*)(int) ),返回类型是void  (*)(int)

22.typedef可以将复杂的类型名字简单化

原名字还是可以用的

但是对于数组指针类型和函数指针类型就有点不一样

例:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

typedef int m;

typedef int(*parr)[10] ;

typedef int(*ppp)(int, int);

int Add(int x, int y)
{
	return x + y;
}
int main()
{
	m a = 10;
	//上述代码等价于
	//int a = 10;

	int arr[10] = { 0 };
	parr a = &arr;
	//上述代码等价于
	//int(*a)[10] = &arr;

	ppp aaa = &Add;
	//上述代码等价于
	//int(*aaa)(int, int) = &Add;

	return 0;
}

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

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

相关文章

css 使用flex 完成瀑布流布局

瀑布流布局在商城类、文章类 app、网页中都是常用的&#xff0c;使用这样的形式&#xff0c;能过让整个页面更加的活波&#xff0c;也能让图片根据实际的大小来显示&#xff0c;更好的展示图片内容。那么代码如何实现呢 实现的效果 代码 <template><view class"…

系统架构设计师教程(七)系统架构设计基础知识

系统架构设计基础知识 7.1 软件架构概念7.1.1 软件架构的定义7.1.2 软件架构设计与生命周期需求分析阶段设计阶段实现阶段构件组装阶段部署阶段后开发阶段 7.1.3 软件架构的重要性 7.2 基于架构的软件开发方法7.2.1 体系结构的设计方法概述7.2.2 概念与术语7.2.3 基于体系结构的…

山西电力市场日前价格预测【2023-12-17】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-12-17&#xff09;山西电力市场全天平均日前电价为467.13元/MWh。其中&#xff0c;最高日前电价为710.68元/MWh&#xff0c;预计出现在17:45。最低日前电价为316.35元/MWh&#xff0c;预计…

VMware----基于 VMware 玩转 CentOS 虚拟机创建、克隆以及配置后台运行

查看原文 文章目录 一、安装 Vmware二、创建 CentOS7 系统的虚拟机三、克隆虚拟机四、设置虚拟机后台运行 一、安装 Vmware &#xff08;1&#xff09;打开VMware下载地址页面&#xff0c;滑动页面&#xff0c;找到如下界面&#xff0c;点击【下载】 &#xff08;2&#xff…

UE4 Niagara学习笔记

需要在其他发射器的同一个粒子位置发射其他粒子就用Spawn Particles from other Emitter 把发射器名字填上去即可 这里Move to Nearest Distance Field Subface GPU&#xff0c;可以将生成的Niagara附着到最近的物体上 使用场景就是做的火苗附着到物体上

轻量封装WebGPU渲染系统示例<51>- 视差贴图(Parallax Map)(源码)

视差纹理是一种片段着色阶段增强材质表面凹凸细节的技术。 当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/ParallaxTexTest.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如…

流量分析基础

定义&#xff1a; 流量分析&#xff08;Traffic Analysis&#xff09;是指对网络流量数据进行分析和解释&#xff0c;以获得有关网络中通信的信息和情报。这种技术可以用于网络安全、网络管理和网络优化等领域。 网络流量包含了许多有关网络通信的细节信息&#xff0c;如源IP地…

【漏洞复现】CVE-2023-36076:smanga漫画阅读系统 远程命令执行 漏洞复现 附POC 附SQL注入和任意文件读取

漏洞描述 无需配置,docker直装的漫画流媒体阅读工具。以emby plex为灵感,为解决漫画阅读需求而开发的漫画阅读器。在windows环境部署smanga安装环境面板,首先安装小皮面板,下载smanga项目,导入数据库,登录smanga,windows部署smanga。 /php/manga/delete.php接口处存在未…

分面中添加不同表格

简介 关于分面的推文&#xff0c;小编根据实际科研需求&#xff0c;已经分享了很多技巧。例如&#xff1a; 分面一页多图 基于分面的面积图绘制 分面中的细节调整汇总 分面中添加不同的直线 基于分面的折线图绘制 最近遇到了另一个需求&#xff1a;在分面中添加不同的表…

赵传和源代码就是设计-UMLChina建模知识竞赛第4赛季第23轮

参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题&#xff0c;即可获得本轮优胜。第4题为附加题&#xff0c;对错不影响优胜者的判定&#xff0c;影响的是优胜者的得分。 所有题目的回答必须放在同一条消息中&#xff0…

C语言之函数式宏

目录 函数和数据类型 函数式宏 函数和函数式宏 函数式宏和对象式宏 不带参数的函数式宏 函数式宏和逗号运算符 函数式宏和函数类似并且比函数更加灵活&#xff0c;下面我们就来学习函数式宏的相关内容。 函数和数据类型 我们来编写一个程序&#xff0c;它能计算出所读取…

【网络安全】网络防护之旅 - 点燃网络安全战场的数字签名烟火

​ &#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《网络安全之道 | 数字征程》⏰墨香寄清辞&#xff1a;千里传信如电光&#xff0c;密码奥妙似仙方。 挑战黑暗剑拔弩张&#xff0c;网络战场誓守长。 ​ 目录 &#x1f608;1. 初识…

计算机网络:DNS域名解析系统

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

Java 第13章 异常 本章作业

1 编程 两数相除的异常处理 各自属于哪些异常&#xff1a; 数据格式不正确 NumberformatException 缺少命令行参数 ArrayIndexOutOfBoundsException 除0异常处理 ArithmeticException ArrayIndexOutOfBoundsException 为数组下标越界时会抛出的异常&#xff0c;可以在检测到命…

swing快速入门(十三)

注释很详细&#xff0c;直接上代码 上一篇 新增内容 1.Dialog&#xff08;模式对话框和非模式对话框&#xff09; 模式对话框&#xff1a;在对话框没有消失之前无法操作父窗口 非模式对话框&#xff1a;对话框的出现不会影响对父窗口的操作 2.setButton&#xff08;对话框设置…

Chromadb词向量数据库总结

简介 Chroma 词向量数据库是一个用于自然语言处理&#xff08;NLP&#xff09;和机器学习的工具&#xff0c;它主要用于词嵌入&#xff08;word embeddings&#xff09;。词向量是将单词转换为向量表示的技术&#xff0c;可以捕获单词之间的语义和语法关系&#xff0c;使得计算…

arthas 线上排查问题基本使用

一、下载 [arthas下载地址]: 下载完成 解压即可使用 二、启动 java -Dfile.encodingUTF-8 -jar arthas-boot.jar 如果直接使用java -jar启动 可能会出现乱码 三、使用 启动成功之后 arthas会自动扫描当前服务器上的jvm进程 选择需要挂载的jvm进程 假如需要挂在坐标【1】的…

机器视觉工程师为什么如何找一个高薪的企业上班

竟然那么辛苦&#xff0c;为什么不找一个工资高的地方被压榨呢&#xff0c;在现在的公司学到的技术&#xff0c;给不到你应有的薪资&#xff0c;那你就只能跳槽来获得&#xff0c;各行各业都有牛人和大佬&#xff0c;各行各业都有高薪的人&#xff0c;只不过看你能不能到那个高…

nginx_rtmp_module 之 ngx_rtmp_live_module模块

模块作用 直播模块代码 ngx_rtmp_live_module.c&#xff0c;主要作用是&#xff1a;当客户端推流或者拉流的时候&#xff0c;创建的rtmp session会加入到 live 模块的存储链表中。 模块配置命令 static ngx_command_t ngx_rtmp_live_commands[] {{ ngx_string("live&…

【Linux】键盘高级操作技巧

命令行最为珍视的目标之一就是懒惰&#xff1a;用最少的击键次数来完成最多的工作。另一个目标是你的手指永 远不必离开键盘&#xff0c;永不触摸鼠标。因此&#xff0c;我们有必要了解一些键盘操作&#xff0c;使我们用起来更加的迅速和高效。 移动光标 在前面介绍过上下左右…
最新文章