拿捏c语言指针(中)

前言

书接上回 拿捏c语言指针(上)

此篇主要讲解的是指针与数组之间的爱恨情仇,跟着我的脚步一起来看看吧~


创造不易,可以帮忙点点赞吗

如有差错,欢迎指出



理解数组名

数组名是首元素地址

例外

1.sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小(单位:字节)

2.&数组名,数组名表示整个数组,取出的是整个数组的地址

让他们分别+1,得到的结果

指针访问数组

p[i]==*(p+i)

arr[i]==*(arr+i)   arr与i交换了后  *(i+arr)==i[arr]


一维数组传参的本质

一维数组传参传的不是整个数组,而是首元素的地址

如图,若是传的是整个数组,结果应该为10

一维数组传参,形参可以是数组,也可以是指针

所以,其中函数test形参int arr[]可以替换为指针形式int*arr

冒泡排序

写一个函数,对一个整数数组的数据进行排序(升序)

思想:相邻两个元素比较,不满足顺序就交换

例如有一个降序数列:

9 8 7 6 5 4 3 2 1 0    未比较

8 9 7 6 5 4 3 2 1 0    8与9比较,9后移

…… 以此类推,9分别与7、 6 ……1、 0 比较

8 7 6 5 4 3 2 1 0 9   第一轮结束

7 8 6 5 4 3 2 1 0 7与8比较,8后移

……以此类推,直到排为升序~

代码实现

#include<stdio.h>
void BubbleSort(int arr[], int sz)
{int i = 0;for (i = 0; i < sz - 1; i++){//一轮冒泡排序的过程int j = 0;for (j = 0; j < sz - 1 - i; j++){//一对数字比较if (arr[j] > arr[j + 1])//交换条件{//交换int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}
}
int main()
{int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);BubbleSort(arr, sz);for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}

优化(提高代码运行效率)

数组arr{9,0,1,2,3,4,5,6,7,8},如果按照原代码,会傻傻地排45次

我们可以增加一些判断,进而提高代码运行效率,

如图,当排完数字9时,count=9;flag==0,第一轮结束

跳出里面for循环,开始第二轮,flag又被赋值为1,即flag==1

if条件判断0与1、1与2……7与8,判断了8次条件都不满足,此时count==17;flag==1,跳出循环

代码如下:

#include<stdio.h>int count = 0;
void BubbleSort(int arr[], int sz)
{int i = 0;for (i = 0; i < sz - 1; i++){int flag = 1;//假设排好了//一轮冒泡排序的过程int j = 0;for (j = 0; j < sz - 1 - i; j++){count++;//用于计算排了几次//一对数字比较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;}}
}
int main()
{int arr[10] = { 9,0,1,2,3,4,5,6,7,8};int sz = sizeof(arr) / sizeof(arr[0]);BubbleSort(arr, sz);for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("count=%d", count);
}

二级指针

指针变量也是变量,他也有自己地址

如图一级指针p存放的是变量a的地址,二级指针pp存放的是一级指针变量p的地址。


指针数组

存放指针的数组,是数组(数组中每个元素是指针类型)

如:int*arr[4],每个元素都是整形指针

利用指针数组模拟实现二维数组

与二维数组的区别

二维数组的每一行是连续的,而模拟实现的不是。

示意图


字符串指针

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

如图,打印*p的值不是字符串,而是字符串的第一个字符

不是把字符串abcdef\0存放在p中,而是把第一个字符的地址存放在p中

示例

《剑指offer》中收录了⼀道和字符串相关的笔试题,代码如下:

#include <stdio.h>
int main()
{char str1[] = "hello bit.";char str2[] = "hello bit.";const char* str3 = "hello bit.";const char* str4 = "hello bit.";if (str1 == str2)printf("str1 and str2 are same\n");elseprintf("str1 and str2 are not same\n");if (str3 == str4)printf("str3 and str4 are same\n");elseprintf("str3 and str4 are not same\n");return 0;
}

运行结果

解释:字符数组str1和str2是可以修改的,他们分别占用不同的空间,所以str1与str2不同

常量字符串str3和str4是不可以修改的,他们占用的空间一致,所以str3与str4相同


数组指针

指向数组的指针,是指针

用于存放数组的地址,能够指向数组的指针变量

与指针数组的区别

int* p1[10]: 指针数组,p1是数组,有10个元素,每个元素的类型是int*

int (*p2)[10]: 数组指针,p2是指针,有10个元素,每个元素的类型是int


二维数组传参的本质

二维数组传参本质上传的是一维数组(二维数组的第一行)的地址

例如

利用数组指针实现一个能够打印二维数组的函数

#include<stdio.h>void Print(int(*arr)[5], int r, int c)
{for (int i = 0; i < r; i++){for (int j = 0; j < c; j++){printf("%d ", *(*(arr + i) + j));}printf("\n");}
}
int main()
{int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };Print(arr, 3, 5);return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每周AI新闻(2024年第7周)OpenAI发布视频生成模型Sora | 谷歌推出Gemini 1.5 | 英伟达公开超级计算机

这里是陌小北&#xff0c;一个正在研究硅基生命的碳基生命。正在努力成为写代码的里面背诗最多的&#xff0c;背诗的里面最会写段子的&#xff0c;写段子的里面代码写得最好的…厨子。 每周日解读每周AI大事件。 这一周&#xff0c;国外各厂真是不让我们消停儿过年呐&#xf…

羊大师揭秘,添加了口味的羊奶难道就变成饮料了吗?

羊大师揭秘&#xff0c;添加了口味的羊奶难道就变成饮料了吗&#xff1f; 尽管给羊奶添加其他口味&#xff0c;它仍然保持着原有的营养价值。虽然改变口味可能会影响人们对羊奶的喜好&#xff0c;但羊奶本身的营养价值并没有因为加入口味而减少。 羊奶是一种富含营养的饮品&a…

专家说第一天上班可以少干点活儿

专家说第一天上班可以少干点活儿。终于有良心专家了&#xff0c;甚合吾意&#xff0c;干脆摸个鱼&#xff0c;聊聊最近偷的懒。 以前偷的懒主要是做过一个数据库偷懒工具&#xff0c;主要是针对我的实际需要CRUD代码自动生成和实体类自动生成等等&#xff0c;这个我好像在csdn…

基于SSM的宁夏旅游网站平台(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的宁夏旅游网站平台&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring …

《苍穹外卖》知识梳理P11-Apache POI导出报表

一.Apache POI 可以通过Apache POI处理excel文件&#xff0c;核心操作是读和写 应用场景 银行网银交易明细各种业务系统导出Excel报表批量导入业务数据 使用步骤 1.导入maven坐标 <dependency><groupId>org.apache.poi</groupId><artifactId>poi&…

RabbitMQ之 Fanout 交换机

&#x1f47d;System.out.println(“&#x1f44b;&#x1f3fc;嗨&#xff0c;大家好&#xff0c;我是代码不会敲的小符&#xff0c;双非大四&#xff0c;Java实习中…”); &#x1f4da;System.out.println(“&#x1f388;如果文章中有错误的地方&#xff0c;恳请大家指正&a…

大数据01-导论

零、文章目录 大数据01-导论 1、数据与数据分析 **数据&#xff1a;是事实或观察的结果&#xff0c;是对客观事物的逻辑归纳&#xff0c;是用于表示客观事物的未经加工的原始素材。**数据可以是连续的值&#xff0c;比如声音、图像&#xff0c;称为模拟数据&#xff1b;也可…

量子算法入门——3.狄拉克符号与量子态(2)

2. 光的极化和S-G实验 光的极化&#xff1a;表达出一方向电场的振动方式 S-G实验 银原子内部介绍 S-G实验过程 在炉子中将银原子高温灼烧&#xff0c;高温使得银原子具有极大的动能&#xff0c;从炉口向四周发射出来&#xff0c;炉口前设置两个小门构成两点一线&#xff…

【hcie-cloud】【30】华为云Stack应用安全于防护

文章目录 前言Web技术基础和常见Web漏洞Web技术Web系统组成URL结构Web后端技术HTTP/HTTPS协议Cookie/Session简介OWASP TOP 10OWASP TOP 10 2021年版访问控制失效 - 越权访问控制失效 - 跨站请求伪造&#xff08;CSRF&#xff09;URL不安全跳转应用安全法律法规及行业规范 Web应…

【ansible】认识ansible,了解常用的模块

目录 一、ansible是什么&#xff1f; 二、ansible的特点&#xff1f; 三、ansible与其他运维工具的对比 四、ansible的环境部署 第一步&#xff1a;配置主机清单 第二步&#xff1a;完成密钥对免密登录 五、ansible基于命令行完成常用的模块学习 模块1&#xff1a;comma…

详解C语言10大字符串函数【超详细建议点赞收藏】

目录 1. strlen----求字符串长度1.1 函数介绍1.2 函数使用1.3 模拟实现 2. strcpy----字符串拷贝2.1 函数介绍2.2 函数使用3.3 模拟实现 3. strcat----字符串追加3.1 函数介绍3.2 函数使用3.3 模拟实现 4. strcmp----字符串比较4.1 函数介绍4.2 函数使用 5. strncpy----长度受限…

Python——列表

一、列表的特性介绍 列表和字符串⼀样也是序列类型的数据 列表内的元素直接⽤英⽂的逗号隔开&#xff0c;元素是可变的&#xff0c;所以列表是可变的数据类型&#xff0c;⽽字符串不是。 列表的元素可以是 Python 中的任何类型的数据对象。如&#xff1a;字符串、…