C语言-排序,初识指针

目录

【1】冒泡排序(从小到大)

【2】选择排序

【3】二维数组

【4】指针

【5】指针修饰

【6】大小端

【7】初见二级指针

练习:


【1】冒泡排序(从小到大)

#include <stdio.h>
//数组哪里的\0?自己和字符串区分下
void bubbleSort(int arr[], int size) {int i, j, temp;for (i = 0; i < size - 1; i++) {for (j = 0; j < size - i - 1; j++) {if (arr[j] > arr[j + 1]) {// 交换相邻的两个数字temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}int main() {int arr[] = {5, 3, 8, 2, 1};int size = sizeof(arr) / sizeof(arr[0]);int i;printf("排序前的数组:");for (i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");bubbleSort(arr, size);printf("排序后的数组:");for (i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}
 

【2】选择排序

#include<stdio.h>
#define N 5
int main(int argc, char const *argv[])
{int a[N]={};int i,j,k,t;for(i=0;i<N;i++)scanf("%d",&a[i]);for(i=0;i<N-1;i++){k=i;for(j=i+1;j<N;j++)if(a[k]>a[j])k=j;if(i != k){t= a[i];a[i]=a[k];a[k]=t;}}for(i=0;i<N;i++)printf("%d ",a[i]);printf("\n");return 0;
}

【3】二维数组

1.格式:

注意 :行数可以省略,列数不能省略

2.元素个数:行数*列数

3.数组名:

int a[][3]={1,2,3,4,5,6};
a:表示第一行的首地址
a+1:表示第二行的首地址

4.初始化:

1)全部初始化:
int a[2][3]={1,2,3,4,5,6};
int a[2][3]={{1,2,3},{4,5,6}};第一行    第二行2)部分初始化:未赋初值时值为0
int a[2][3]={1,2,3,4};		//123 400
int a[2][3]={{1,2},{5,6}};	//1 2 0 5 6 03) 未初始化:需要分别赋值,未赋初值值为随机值
int a[2][3];

5.内存分配:

a:第一行首地址
a+1:第二行首地址
a[0]:第一行第一列的地址
a[1]:第二行第一列的地址

6.计算大小:

sizeof(数组名)

行*列*数据类型的大小

7.遍历数组:

for循环嵌套,外层行,内层列
for(i=0;i<2;i++)for(j=0;j<3;j++)printf("%d  ",a[i][j]);

练习:有一个3x4的矩阵(元素值不相同),要求输出其中最大值以及它的行号和列号

 //下标替换法
#include<stdio.h>
int main(int argc, char const *argv[])
{int a[3][4]={15,14,13,2,5,9,46,56,12,78,89,13};int i,j,h=0,l=0;for(i=0;i<3;i++)for(j=0;j<4;j++)if(a[i][j]>a[h][l]){h=i;l=j;}printf("max:%d 行号:%d 列号:%d\n",a[h][l],h+1,l+1);return 0;
}

 

练习:

猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。

以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

#include <stdio.h>int calculatePeaches(int days) {int peaches = 1;for (int i = days; i >= 1; i--) {peaches = (peaches + 1) * 2;}return peaches;
}int main() {int days = 10;int totalPeaches = calculatePeaches(days);printf("第一天共摘了 %d 个桃子。\n", totalPeaches);return 0;
}

打印杨辉三角形的前十行:重点理清for的查看查看顺序,不要老是整体看,要分开看,一步步看

#include <stdio.h>int main() {int numRows = 10;int triangle[numRows][numRows];// 初始化杨辉三角形的第一列和对角线为1for (int i = 0; i < numRows; i++) {triangle[i][0] = 1;triangle[i][i] = 1;}// 生成杨辉三角形的其他数值for (int i = 2; i < numRows; i++) {for (int j = 1; j < i; j++) {triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j];}}// 输出杨辉三角形的前十行for (int i = 0; i < numRows; i++) {for (int j = 0; j <= i; j++) {printf("%d ", triangle[i][j]);}printf("\n");}return 0;
}
 

【4】指针

1. 概念:

地址:在内存中每个字节都有编号,编号就是地址

指针:指针就是地址

指针变量:存放地址的变量

2. 定义格式:

例子:
int a=5;
int *p = &a;
char ch = 'a';
char * q = &ch;

3. 指针操作符:

&:取地址,取变量的地址

* :取内容,取地址里面的内容

&和*是互逆的,*&a == a &*p == p

4. 初始化:

指针使用前不仅要定义,还要初始化

1)将普通变量的地址赋值给指针变量
int a = 5;
1.int * p = &a;
printf("%d %d\n",a,*p);//a的值  5 5
printf("%p %p\n",&a,p);//a的地址
a = 10;				   //是地址,就有地址特性
printf("%d %d\n",a,*p);//a的值 10 10
*p = 20;
printf("%d %d\n",a,*p);//a的值 20 20
2.int * p = NULL;
p = &a;2)将数组的首地址赋值给指针变量
char s[10]="hello";
char * p = s;		//p指向hello字符串中字符h3)将指针变量里面保存的地址赋值给另一个指针变量
int a= 20;
int *p = &a;
int *q = p;

5. 指针运算:

1)算术运算

p++:指针向高地址方向移动一个数据单位,指针的指向发生变化

p--:指针向低地址方向移动一个数据单位,指针的指向发生变化

p+n:访问了高地址方向第n个数据的地址,指针的指向不发生变化

p-n:访问了低地址方向第n个数据的地址,指针的指向不发生变化

两个地址之间的差是相隔元素的个数

2) 关系运算

>	<	==    !=
关系运算比较的是指向地址的高低
指向高地址的指针  大于 指向低地址的指针
int a[5]={};
int *p = &a[1];
int *q = &a[3];
q>p
注:只能在同一个数组间进行地址的比较

6. 指针的大小:

sizeof(指针名)=4(32位操作系统)

总结:

1) 32位操作系统指针大小4字节,64位操作系统指针大小8字节

2) 内存地址是固定的,但是变量地址是不固定的

3) 指针类型根据指针指向空间的数据类型确定的

7. 段错误:Segmentation fault (core dumped)

原因有两条:

1)野指针,没有明确指向的指针

产生原因:1.指针变量没有初始化 2.指针p被free之后没有重新赋值

解决:int * p = NULL;

2)对非法空间赋值

练习:

将字符串转换成整型数字输出。用指针实现

要求:字符串为0-9组成,输出数据为一个整形数

Eg:char s[10]=”123”;printf(“%d\n”,num);//num=123;

#include <stdio.h>int strToInt(char* str) {int num = 0;while (*str != '\0') {num = num * 10 + (*str - '0');str++;}return num;
}int main() {char s[10] = "123";int num = strToInt(s);printf("%d\n", num); // 输出:123return 0;
}
 

练习:字符串倒置(用指针实现) 如:hello->olleh

#include <stdio.h>void reverseString(char* str) {char* start = str;char* end = str;char temp;// 找到字符串的末尾while (*end != '\0') {end++;}end--; // 指向最后一个非空字符// 交换字符位置,直到两个指针相遇while (start < end) {temp = *start;*start = *end;*end = temp;start++;end--;}
}int main() {char s[10] = "hello";reverseString(s);printf("%s\n", s); // 输出:ollehreturn 0;
}
 

【5】指针修饰

1.const
1)const int a=10;	// int const a=10;	a=20;	//报错,const修饰a为只读
定义一个指针p指向a,可以通过修改*p改变a的值2)const int *p;		//指针指向的内容不能修改,指针的指向可以修改
int  const *p;
int a = 10;
const int *p = &a;
a)*p = 20;			//报错,*p被const修饰,不能被赋值
b)int b = 20;p=&b;	//√3)int * const p;//指针的指向不能修改,指针指向的内容可以修改
int a=10;
int b = 20;
int * const p = &a;
a)*p = 20;//正确
b)p= &b;//错误2.void
void a;//错误
void * p;//任意类型的指针
注意:通过void类型指针取数据时,需要对地址进行强转
(int *)p

【6】大小端

在计算机存储超过一个字节数据的时候,会存在数据存储顺序的不同,分为大端和小端

大端:低地址存放高字节数据,高地址存放低字节数据

小端:低地址存放低字节数据,高地址存放高字节数据

举例:存数据0x12345678,起始地址,0x40000x4000	0x4001	0x4002	0x4003
大端:		12		34		56		78
小端:		78		56		34		12

【7】初见二级指针

一级指针:存放变量的地址

二级指针:存放一级指针的地址

格式:存储类型  数据类型  **变量名;
例:
int a= 10;
int * p = &a;
int **q = &p;访问a的值:
a  *p  **q
访问a的地址:
&a   p  *q
访问p的地址:
&p  q

练习:

给定一串字符"I love china",实现以单词为单位的逆序,如:"china love i"

思路:可以先全部倒过来:anihc evol i,然后再把每个单词倒过来

#include <stdio.h>
#include <string.h>int main(int argc, char const *argv[])
{// char a[32] = "i love China";char a[32]={};scanf("%[^\n]",a);char t;char *p = a;char *q = a + strlen(a) - 1;char *k = NULL;while (p < q){t = *p;*p = *q;*q = t;p++;q--;}printf("%s\n", a);p = q = a;while (*p != '\0'){while (*p == ' ')p++;q = p; //找单词结尾while (*q != ' ' && *q != '\0')q++;k = q; //暂存空格或\0地址q--;while (p < q){t = *p;*p = *q;*q = t;p++;q--;}p=k;}printf("%s\n",a);return 0;
}

用指针将整型组s[8]={1,2,3,4,5,6,7,8}中的值逆序存放

#include <stdio.h>
void reverseArray(int* arr, int size) {int* start = arr;int* end = arr + size - 1;int temp;// 交换数组元素位置,直到两个指针相遇while (start < end) {temp = *start;*start = *end;*end = temp;start++;end--;}
}int main() {int s[8] = {1, 2, 3, 4, 5, 6, 7, 8};int size = sizeof(s) / sizeof(int);reverseArray(s, size);for (int i = 0; i < size; i++) {printf("%d ", s[i]); // 输出:8 7 6 5 4 3 2 1}return 0;
}

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

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

相关文章

Flink 在新能源场站运维的应用

摘要&#xff1a;本文整理自中南电力设计院工程师、注册测绘师姚远&#xff0c;在 Flink Forward Asia 2022 行业案例专场的分享。本篇内容主要分为四个部分&#xff1a; 建设背景 技术架构 应用落地 后续及其他 点击查看原文视频 & 演讲PPT 一、建设背景 建设背景主要…

Yalmip入门教程(3)-约束条件的定义

博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译&#xff1a;https://yalmip.github.io/tutorials/ 之前的博客简单介绍了约束条件的定义方法&#xff0c;接下来将对其进行详细介绍。 首先简单复习一下&#xff1a; 1.定义约束条件可以使用矩阵拼接…

GRE和MGRE

目录 GRE GRE环境的搭建 MGRE MGRE的配置 MGRE环境下的RIP网络 MGRE实验 VPN 说到GRE&#xff0c;我们先来说个大家熟悉一点的&#xff0c;那就是VPN技术。 背景需求 企业、组织、商家等对专用网有强大的需求。 高性能、高速度和高安全性是专用网明显的优势。 物理专…

Notepad++ 配置python虚拟环境(Anaconda)

Notepad配置python运行环境步骤&#xff1a; 打开Notepad ->”运行”菜单->”运行”按钮在弹出的窗口内输入以下命令&#xff1a; 我的conda中存在虚拟环境 (1) base (2) pytorch_gpu 添加base环境至Notepad中 cmd /k chdir /d $(CURRENT_DIRECTORY) & call cond…

TX Barcode .NET for WPF Crack

TX Barcode .NET for WPF Crack 用于WPF软件的TX Barcode.NET包括一天完成的功能以及用于WPF的软件的2D条形码控制。 用于WPF的TX Barcode.NET的功能和属性&#xff1a; 它具有以下特性和属性&#xff0c;如&#xff1a; 常见的文字处理功能&#xff1a;它可以为用户和开发人员…

FastEdit ⚡:在10秒内编辑大型语言模型

概述&#xff1a; 这个仓库旨在通过一个单一的命令&#xff0c;有效地将新鲜且定制化的知识注入到大型语言模型中&#xff0c;以辅助开发人员的工作。 支持的模型&#xff1a;○ GPT-J (6B)○ LLaMA (7B/13B)○ BLOOM (7.1B)○ Falcon (7B)○ Baichuan (7B/13B)○ InternLM (7…

stable diffusion windows本地搭建的坑

刚刚2小时前&#xff0c;我搭好了&#xff0c;欣喜若狂&#xff0c;开放端口&#xff0c;同事也尝试了。我的配置 16G内存&#xff0c;AMD卡&#xff0c;有gpu但是没有用。这里不说具体步骤&#xff0c;只说坑点。 首先就是安装gfpgan、clip、openclip问题&#xff0c;我参考…

Kind | Kubernetes in Docker 把k8s装进docker!

有点像杰克船长的黑珍珠 目录 零、说明 一、安装 安装 Docker 安装 kubectl 安装 kind 二、创建/切换/删除集群 创建 切换 删除 将镜像加载到 kind 群集中 零、说明 官网&#xff1a;kind Kind&#xff1a; Kubernetes in Docker 的简称。kind 是一个使用 Docker 容…

CentOS5678 repo源 地址 阿里云开源镜像站

CentOS5678 repo 地址 阿里云开源镜像站 https://mirrors.aliyun.com/repo/ CentOS-5.repo https://mirrors.aliyun.com/repo/Centos-5.repo [base] nameCentOS-$releasever - Base - mirrors.aliyun.com failovermethodpriority baseurlhttp://mirrors.aliyun.com/centos/$r…

数据仓库建设-数仓分层

数据仓库能够帮助企业做出更好的决策&#xff0c;提高业务效率和效益&#xff1b;在数据仓库建设时&#xff0c;绕不开的话题就是数仓分层。 一、数据分层的好处 1. 降低数据开发成本 通用的业务逻辑加工好&#xff0c;后续的开发任务可以基于模型快速使用&#xff0c;数据需…

IDEA使用方式

1.翻译 1.Plugins插件&#xff1a;Chinese中文插件 文件F 编辑E 视图V 导航N 代码C 分析Z 重构R 构建B 运行U 工具T VCSS 窗口W 帮助H文件N 新建N 打开 打开最近 关闭项目 设置T 项目结构 文件属性 保存全部S 从磁盘全部重新加载 作废缓存/重启 导出/导入操作 其他设置 导出 打…

windows下mysql8定时备份,bat脚本编写,dos免密执行

前提&#xff1a;mysql8已经安装。 编写脚本copy_mysql_data.bat echo off set timestamp%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2% set backupfileD:\ProgramData\MySQL\Backup\backup_%timestamp%.sql set mysqlpathD:\Program Files\MySQL\MyS…

ubuntu版本Linux操作系统上安装键盘中文输入法

要在ubuntu版本Linux操作系统上安装键盘中文输入法 可以按照以下步骤进行操作&#xff1a; 1、Linux终端输入&#xff1a;sudo apt-get install ibus-pinyin 这将安装一个常用的中文输入法 “ibus-pinyin”。 2、重新启动系统&#xff1a;为了使输入法生效&#xff0c;需要…

ubuntu打开usb摄像头

文章目录 前言一、识别 usb 摄像头二、安装应用程序显示摄像头捕捉到的视频1、使用应用程序茄子&#xff08;cheese&#xff09;2、运行 cheese 捕捉视频 前言 记录一下解决在 Linux 下打开 usb 摄像头界面黑屏的问题。 一、识别 usb 摄像头 1、保持在 ubuntu 界面&#xff0…

前端学习记录~2023.7.17~CSS杂记 Day9

前言一、浮动1、使盒子浮动起来2、清除浮动3、清除浮动元素周围的盒子&#xff08;1&#xff09;clearfix 小技巧&#xff08;2&#xff09;使用 overflow&#xff08;3&#xff09;display: flow-root 二、定位1、定位有哪些2、top、bottom、left 和 right3、定位上下文4、介绍…

科技赋能企业,实现数字化转型

科技是第一生产力&#xff0c;数字技术即科技&#xff0c;可以改变传统的商业模式&#xff0c;为各行各业注入新的活力。 推动企业数字化转型&#xff0c;可是实现行业的效率提升&#xff0c;实现跨界重组&#xff0c;重构产业模式&#xff0c;为产业格局重新赋能&#xff0c;最…

AJAX: 事件循环(举例细论)

概念&#xff1a;执行任务和收集异步任务&#xff0c;在调用栈空闲时&#xff0c;反复调用任务队列里回调函数的一种执行机制 原因&#xff1a;JavaScript 是单线程的&#xff0c;为了不阻塞 JS 引擎&#xff0c;设计执行代码的模型 JS内代码如何执行&#xff1a; 执行同步代…

PHP与Golang对战:两种语言的比较与应用场景探讨

引言 在软件开发领域&#xff0c;选择一种合适的编程语言对于项目的成功至关重要。而在今天的文中&#xff0c;我们将探讨两个备受争议的编程语言——PHP与Golang之间的对战。通过比较它们的优势和应用场景&#xff0c;帮助开发者更好地了解如何选择适合自己项目的语言。 PHP的…

伙伴云CEO戴志康:我们为什么要做伙伴云?

分享嘉宾&#xff1a;戴志康&#xff0c;伙伴云CEO 以下为演讲实录⬇⬇⬇ 01选择人更少的一条路&#xff0c;从B级走向A级 我一直想和大家交流一个话题&#xff0c;关于我们为什么要做伙伴云。既代表我自己&#xff0c;同时也代表我们团队的一些想法。 我是一个怀疑论者。大…

Win10 配置NDK安装2023.7.19版本

NDK安装流程 1. 下载&#xff1a;2. 安装&#xff1a;3. 测试&#xff1a; 在大多数情况下&#xff0c;使用 Android SDK 管理器安装 NDK 会更轻松。本文单独安装NDK&#xff0c;但后续也可以使用管理器进行管理。 1. 下载&#xff1a; 地址 Fig.1 最新稳定版本 2. 安装&…