C语言补充:指针的基础理解

news2024/9/17 3:58:20

在这里插入图片描述

1.int* 和 char* 的修改字节上的区别及指针的运算

先看两段代码:

int a = 0x11223344;
int* pa = &a;
*pa = 0;
int a = 0x11223344;
char* pa = &a;
*pa = 0;

在这里插入图片描述
在这里插入图片描述
这里我们不难发现对于指针的改变其实是取决于对应的指针类型的,32位环境下char就是一个字节,而int为4个字节

知道了这一点之后我们就可以对指针+/-数实际上就是跳过对应的字节

int main() {
	int arr[5] = { 1,2,3,4,5 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int* p = &arr[0];
	for (int i = 0; i < sz; i++)
	{
		printf("%d", *p);
		p++;
		//也可以写成:printf("%d", *(p + i));
	}
	return 0;
}

这就是指针加上数字,那么指针-指针有什么意义吗
其实可以类比成日期-日期就能算到中间差几天,那么指针就是中间差的元素数
例如:用char*类型计算字符中间的差值

int my_strlen(char* p) {
	char* p1 = p;
	while (*p != '\0')
	{
		p++;
	}
	return p - p1;//指针-指针
}

int main() {
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d", len);
	return 0;
}

2.const的对变量和指针的作用

int main() {
	const int n = 10;
	//n = 0;          //err n无法改变
	//arr[n];         //err n为常量就不会报错
	int* p = &n;
	*p = 0;
	printf("%d", n);  //n=0
	return 0;
}

由此我们可以看出对于变量的限制并不会使变量改变成常量,而且可以通过指针的方式让变量改变

而对指针的修饰有两种

int main() {
	int a = 0;
	int b = 10;
	const int* p = &a;
	p = &b;
	//*p = 10;       //err

	int* const ps = &a;
	//ps = &b;      //err
	*ps = 10;
	return 0;
}

3.传值调用和传址调用

传值调用:仅仅使用值

void Swap(int x, int y) {
	int z = 0;
	z = x;
	x = y;
	y = z;
}

int main() {
	int a = 10;
	int b = 20;
	printf("交换前:%d,%d\n", a, b);//交换前:10, 20
	Swap(a, b);
	printf("交换后:%d,%d\n", a, b);//交换后:10, 20
	return 0;
}

传址调用:要对传过去的值进行修改

void Swap(int* x, int* y) {
	int z = 0;
	z = *x;
	*x = *y;
	*y = z;
}

int main() {
	int a = 10;
	int b = 20;
	printf("交换前:%d,%d\n", a, b);//交换前:10, 20
	Swap(&a, &b);
	printf("交换后:%d,%d\n", a, b);//交换后:20,10
	return 0;
}

4.数组名的理解

数组名一般就是首元素的地址除了以下几种情况:

  1. sizeof(数组名) 表示整个数组的地址
  2. &(数组名) 取出的是整个数组的地址
    在这里插入图片描述
    知道了一点就可以进行输入函数了
int main() {
	int arr[10];
	int* p = arr;
	int sz = sizeof(arr) / sizeof(arr[0]);
	
	for (int i = 0; i < sz; i++) {
		scanf("%d", p + i);
	}
	
	for (int i = 0; i < sz; i++) {
		printf("%d ", *(p + i));//arr[1]=*(arr+1) -->  *(p + i)=p[i]
	}
	return 0;
}

这里以将arr[1]和*(arr+1)认为是一致的那我们就可以认为平时的传数组调用了

void size_arr(int arr[]) {                 //void size_arr(int* arr)
	int sz = sizeof(arr) / sizeof(arr[0]); //1
	printf("%d", sz);
}

int main() {
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("%d\n", sz);                    //9
	size_arr(arr);
	return 0;
}

5.冒泡排序

int main() {
	int arr[8] = { 7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sz - 1; i++)        //将一个数据放到正确的位置,最坏的情况要跑sz-1次
	{
		for (int j = 0; j < sz - 1 - i; j++)//sz-1是为了交换sz-1个数据,-i是为了减去已经放置好的数据
		{
			if (arr[j] < arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
	
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

第一个循环:将一个数据放到正确的位置,最坏的情况要跑sz-1次
第二个循环:sz-1是为了交换sz-1个数据,-i是为了减去已经放置好的数据
这里可以优化:

int main() {
	int arr[8] = { 7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sz - 1; i++)//将一个数据放到正确的位置,最坏的情况要跑sz-1次
	{
		int flag = 1;//假设已经有序
		for (int j = 0; j < sz - 1 - i; j++)//sz-1是为了交换sz-1个数据,-i是为了减去已经放置好的数据
		{
			if (arr[j] < arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				flag = 0;//交换就证明无序
			}
		}
		if (flag == 1)
		{
			break;
		}
	}
	
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

6.qsort函数的使用

我们使用排序是不一定总是在比较整形,如果是字符串类型或结构体那么就可以使用到去qsort函数了

使用时我们要知道4个参数:

  1. void* base 指针指向要排序的第一个数组
  2. size_t num base指向的待排序的元素数组个数
  3. size_t size base指向待排序元素的大小
  4. int * (compar) (const void *, const void *) 函数指针指向的是如何比较元素的函数
    函数的返回值:
    p1>p2 返回>0的数
    p1=p2 返回0
    p1<p2 返回<0的数
int Cmp_int(const void* e1, const void* e2)//e1为第一个要比较元素地址,e2为第二个要比较元素的地址
{
	//p1>p2 返回>0的数
	//p1=p2 返回0
	//p1<p2 返回<0的数
	if (*(int*)e1 > *(int*)e2)
		return 1;
	else if (*(int*)e1 == *(int*)e2)
		return 0;
	else
		return -1;
}

void test01()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(int), Cmp_int);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

int main() {
	test01();
	return 0;
}

在这种情况的返回值可以改成为

int Cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}

void test01()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(int), Cmp_int);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

int main() {
	test01();
	return 0;
}

对于其他的结构也是这样,下面为结构题的示例,分别可以按照自己想来的进行排序

struct Stu
{
	char name[20];
	int age;
};

int Cmp_struct_by_name(const void* p1,const void* p2)
{
	return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);
}

int Cmp_sturct_by_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e1)->age;
}

void test02() {
	struct Stu arr[3] = { {"zhangsan",20},{"lisi",35},{"wangwu",18} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), Cmp_struct_by_name);
}

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

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

相关文章

干货:如何高效检索和阅读文献

前言:Hello大家好,我是小哥谈。高效检索和阅读文献是科研过程中非常重要的一环,它能够帮助我们快速找到所需的信息并进行深入的学习和理解。本文就说明一下如何高效检索和阅读文献。🌈 目录 🚀1.炼成“高搜商” 🍀🍀1.1 文献检索 🍀🍀1.2 ⽂献树思维 �…

c++初阶知识——类和对象(1)

目录 1.类和对象 1.1 类的定义 1.2 访问限定符 1.3 类域 2.实例化 2.1 实例化概念 2.2 对象大小 内存对齐规则 3.this指针 1.类和对象 1.1 类的定义 &#xff08;1&#xff09;class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xf…

数据(图像)增广

一、数据增强 1、增加一个已有数据集&#xff0c;使得有更多的多样性&#xff0c;比如加入不同的背景噪音、改变图片的颜色和形状。 2、增强数据是在线生成的 3、增强类型&#xff1a; &#xff08;1&#xff09;翻转 &#xff08;2&#xff09;切割 &#xff08;3&#xf…

AI大模型API:开启智能应用的新纪元

AI大模型API是当今技术领域的重要突破&#xff0c;它们以其卓越的性能和强大的计算能力引领着人工智能的发展。这些API不仅仅是一种技术工具&#xff0c;更是推动智能化时代的核心驱动力。通过AI大模型类API&#xff0c;我们可以利用先进的算法和深度学习模型&#xff0c;实现各…

k8s NetworkPolicy

Namespace 隔离 默认情况下&#xff0c;所有 Pod 之间是全通的。每个 Namespace 可以配置独立的网络策略&#xff0c;来 隔离 Pod 之间的流量。 v1.7 版本通过创建匹配所有 Pod 的 Network Policy 来作为默认的网络策略 默认拒绝所有 Pod 之间 Ingress 通信 apiVersion: …

heic格式转化jpg?三种方法轻松解决Heic图片转换

HEIC是苹果IOS 11系统推出的图片格式&#xff0c;它采用了最新的图片处理技术&#xff0c;在不损坏图片质量的情况下&#xff0c;减少占用系统。很多使用mac系统的小伙伴都有这样的困惑&#xff0c;如何将HEIC格式的图片转换成JPG呢&#xff1f;小编今天给大家分享3种适用的hei…

Oracle安装完之后设置开机自启动配置步骤

默认&#xff1a;dbca建库时都会自动创建/etc/oratab文件 [oraclelocalhost bin]# vi /etc/oratab 将“orcl:/home/oracle/product/11.2.0/dbhome_1:N”&#xff0c;改为 “orcl:/home/oracle/product/11.2.0/dbhome_1:Y”。 修改完成后&#xff0c;保存退出--选项代表开机是…

不仅是输出信息,console.log 也能玩出花

console.log 是 JavaScript 中一个常用的函数&#xff0c;用于向控制台输出信息。 console.log 虽然主要用于调试目的&#xff0c;但也包含了一些有趣的用法&#xff0c; console.log 不仅能输出文本&#xff0c;还能以更丰富的方式展示信息。 比如我们打开 B 站&#xff0c;然…

Win10安装MongoDB(详细版)

文章目录 1、安装MongoDB Server1.1. 下载1.2. 安装 2、手动安装MongoDB Compass(GUI可视工具)2.1. 下载2.2.安装 3、测试连接3.1.MongoDB Compass 连接3.2.使用Navicat连接 1、安装MongoDB Server 1.1. 下载 官网下载地址 https://www.mongodb.com/try/download/community …

ElasticSearch(二)【基本操作以及集成 SpringBoot】

启动 elasticsearch&#xff08;脚本&#xff09;、kibana&#xff08;bat脚本&#xff09; 和 elasticsearch-head-master&#xff08;npm run start&#xff09; 1、RESTful 风格 1.1、索引类基本操作 1.1.1、创建索引 PUT /索引名/类型名/文档id {请求体} 在 elasticsear…

Rewrk一个更现代的http框架基准测试实用程序

Rewrk一个更现代的http框架基准测试实用程序。HTTP基准测试&#xff08;HTTP benchmarking&#xff09;是一种测量和评估HTTP服务器或应用程序性能指标的活动。其目的是在特定条件下模拟大量用户请求&#xff0c;以测量服务器或应用程序的响应能力、吞吐量、延迟等指标&#xf…

员工微信号怎么管理

员工走私单或者离职了删除客户&#xff0c;删除撤回的消息也能看得见

强引用?软引用?弱引用?虚引用?一文带你彻底搞懂!!

强引用&#xff1f;软引用&#xff1f;弱引用&#xff1f;虚引用&#xff1f;一文带你彻底搞懂&#xff01;&#xff01; 前言引用级别强引用软引用弱引用虚引用 总结 前言 我们知道 JVM 的 GC 是不受程序控制的&#xff0c;只要满足条件就会自动触发 那他是根据什么触发的呢…

Apache防盗链、网页压缩、网页缓存

目录 网页压缩 类型 示例 动态添加模块操作步骤 重装Apache操作步骤 网页缓存 示例 操作步骤 隐藏版本信息 操作步骤 Apache防盗链 定义 原理 配置防盗链实验环境 实验环境 本地图片盗链示例 操作步骤 防盗链示例 操作步骤 网页压缩 网站的访问速度是由多个…

C语言 结构体和共用体——对结构体的操作

目录 如何访问结构体的成员&#xff1f; 结构体变量的赋值操作 结构体变量的取地址值操作 如何访问结构体的成员&#xff1f; 结构体变量的赋值操作 结构体变量的取地址值操作

C++基础技能:如何在VisualStudio中使用clang-format格式化代码

目录 1.下载 clang-format.exe程序 2.clang-format详细参数说明 3.Visual Studio中设置使用clang-format 4.创建.clang-format文件 5.在Visual Studio中触发格式化 1.下载 clang-format.exe程序 下载源&#xff1a; https://llvm.org/builds/下载最新的clang-format。ht…

开发编码规范笔记

前言 &#xff08;1&#xff09;该博客仅用于个人笔记 格式转换 &#xff08;1&#xff09;查看是 LF 行尾还是CRLF 行尾。 # 单个文件&#xff0c;\n 表示 LF 行尾。\r\n 表示 CRLF 行尾。 hexdump -c <yourfile> # 单个文件&#xff0c;$ 表示 LF 行尾。^M$ 表示 CRLF …

晨持绪电商:开一家抖音网店到底有前景吗

在数字化浪潮汹涌的今天&#xff0c;抖音作为一颗耀眼的新星&#xff0c;不仅重塑了人们的娱乐方式&#xff0c;更是成为电商领域的新战场。但许多人仍在观望&#xff0c;心中充满疑问&#xff1a;开一家抖音网店&#xff0c;究竟有没有前景? 抖音的流量优势不容忽视。凭借数亿…

CVE-2024-23692: Rejetto HTTP File Server 2.3m Unauthenticated RCE漏洞复现

目录 本文章仅供学习使用&#xff01;&#xff01;&#xff01; Rejetto HTTP介绍 漏洞简介 漏洞环境 漏洞复现 exp 复现 结果 如何修复 本文章仅供学习使用&#xff01;&#xff01;&#xff01; Rejetto HTTP介绍 Rejetto是一个流行的开源软件项目&#xff0c;主要…

【RHCE】dns实验0709

题目&#xff1a; 配置主服务器的web内容 web部分 创建web页面 修改增加etc/hosts内容且重启 测试&#xff1b; dns 区域文件 防火墙放行&#xff1a; 主服务器测试从服务器 从服务器 web dns 防火墙放行服务 selinux放行&#xff1a; 创建文件 定义特定文件 测试&#xff1…