复习第六课 C语言-排序,初识指针

news2024/11/18 11:40:07

目录

【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 0
	
3) 未初始化:需要分别赋值,未赋初值值为随机值
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];

    // 初始化杨辉三角形的第一列和对角线为1
    for (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字符串中字符h

3)将指针变量里面保存的地址赋值给另一个指针变量
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); // 输出:123
    return 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); // 输出:olleh
    return 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,起始地址,0x4000
			0x4000	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.coloradmin.cn/o/756568.html

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

相关文章

论文阅读-2:基于深度学习的大尺度遥感图像建筑物分割研究

一、该网络中采用了上下文信息捕获模块。通过扩大感受野&#xff0c;在保留细节信息的同时&#xff0c;在中心部分进行多尺度特征的融合&#xff0c;缓解了传统算法中细节信息丢失的问题&#xff1b;通过自适应地融合局部语义特征&#xff0c;该网络在空间特征和通道特征之间建…

SSH框架简介篇

文章目录 概述目录结构 strutsSpringHibernate总结 概述 SSH框架&#xff08;Struts Spring Hibernate&#xff09;是一种广泛应用的Java企业级开发框架组合&#xff0c;它将Struts、Spring和Hibernate三个优秀的框架有机地结合在一起&#xff0c;提供了一套完整的解决方案&…

cmake 函数相关

目录 cmake函数和宏基础 demo cmake函数和宏的参数处理 cmake函数和宏的基本使用 demo cmake函数和宏使用变量 demo demo cmake函数和宏需要注意的地方 demo cmake函数和宏的关键字参数 demo 使用第二种形式cmake_parse_arguments() demo 关键字list demo singl…

GDB 调试代码

目录 一、其他调试代码的工具 二、GDB调试 1、调试准备 2、开始调试 3、调试命令 1.运行程序 2.退出gdb 3.传参 4.查看代码 5.设置或删除断点及相关操作 6.继续运行 7.运行中打印某些值及其类型 8.自动的打印某些值和信息及其相关操作 9.单步调试 10.设置变量的…

http-server 的安装与使用

文章目录 问题背景http-server简介安装nodejs安装http-server开启http服务http-server参数 问题背景 打开一个文档默认使用file协议打开&#xff0c;不能发送ajax请求&#xff0c;只能使用http协议才能请求资源&#xff0c;所以此时我们需要在本地建立一个http服务&#xff0c…

基于java的智能停车场管理系统

背景 智能停车场管理系统的主要使用者分为管理员和用户&#xff0c;实现功能包括管理员&#xff1a;个人中心、用户管理、车位信息管理、车位租用管理、车位退租管理、违规举报管理、论坛交流、系统管理&#xff0c;用户&#xff1a;个人中心、车位租用管理、车位退租管理、违…

MySQL每日一练——MySQL多表查询进阶挑战

目录 1、首先创建表 t_dept: t_emp: 2、插入数据 t_dept表&#xff1a; t_tmp表: 3、修改表 4、按条件查找 1、首先创建表 t_dept: CREATE TABLE t_dept (id INT(11) NOT NULL AUTO_INCREMENT,deptName VARCHAR(30) DEFAULT NULL,address VARCHAR(40) DEFAULT NULL,P…

为什么单片机可以直接烧录程序的原因是什么?

单片机&#xff08;Microcontroller&#xff09;可以直接烧录程序的原因主要有以下几点&#xff1a; 集成性&#xff1a;单片机是一种高度集成的芯片&#xff0c;内部包含了处理器核心&#xff08;CPU&#xff09;、存储器&#xff08;如闪存、EEPROM、RAM等&#xff09;、输入…

JavaScript 使用URL跳转传递数组对象数据类型的方法

文章目录 首先了解一下正常传递基本数据类型JavaScript 跳转页面方法JavaScript 路由传递参数JavaScript 路由接收参数传递对象、数组效果&#xff1a; 在前端有的时候会需要用链接进行传递参数&#xff0c;基本数据类型的传递还是比较简单的&#xff0c;但是如果要传递引用数据…

AWS 解决方案架构师「免费考」

周五晚&#xff0c;AWS 推出了的训练营活动&#xff0c;这对于正在准备 Cloud Practitioner 的我来说&#xff0c;简直不要太开心。官方文章原文链接《限定&#xff01;直冲「云」霄训练营开营啦》。 PART-01 训练营简介 看到推送后第一时间点了进去&#xff0c;活动的情况简…

Socket API使用——模拟http协议

Socket API使用——模拟http协议 简单的c/s程序——服务端实例 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; import java.nio.char…

Python np.unique()函数详解

np.unique()函数详解&#xff1a;返回数组的唯一值唯一值默认已进行从小到大的排序 一些重要参数 return_index&#xff1a;bool, optional。如果设置为True,返回数组中唯一值的索引号&#xff1b;否则不返回。 注意&#xff1a;返回的数组和输入的数组的大小不相同&#xf…

第十五章——友元、异常

友元 类并非只能拥有友元函数&#xff0c;也可以将类作为友元。在这种情况下&#xff0c;友元类的所有方法都可以访问原始类的私有成员和保护成员。因此尽管友元被授予从外部访问类的私有部分的权限&#xff0c;但它们并不与面向对象的编程思想相悖&#xff0c;相反提高了共有…

《C++程序设计原理与实践》笔记 第20章 容器和迭代器

本章和下一章将介绍STL&#xff0c;即C标准库的容器和算法部分。关键概念序列和迭代器用于将容器&#xff08;数据&#xff09;和算法&#xff08;处理&#xff09;联系在一起。 20.1 存储和处理数据 首先考虑一个简单的例子&#xff1a;Jack和Jill各自在测量车速&#xff0c…

echarts x轴文字过长 文字换行显示

xAxis: {type: "category",data: [四美休闲娱乐文化场馆, 资讯, 大咖分享],axisLabel: {show: true,fontSize: 10,interval: 0,color: "#CAE8EA",formatter: function (params) {var newParamsName "";var paramsNameNumber params.length;var…

MySQL数据库基础 18

第18章_MySQL8其它新特性 1. MySQL8新特性概述1.1 MySQL8.0 新增特性1.2 MySQL8.0移除的旧特性 2. 新特性1&#xff1a;窗口函数2.1 使用窗口函数前后对比2.2 窗口函数分类2.3 语法结构2.4 分类讲解1. 序号函数2. 分布函数3. 前后函数4. 首尾函数5. 其他函数 2.5 小 结 3. 新特…

【讲座笔记】Continual Learning and Memory Augmentation with Deep Neural Networks

20230607【开放世界的感知&#xff1a;探索可迁移与可持续学习之路】巩东&#xff1a;Continual Learning and Memory Augmentation……_哔哩哔哩_bilibili 游荡……游荡……找个talk看一下 讲的是continuous learning&#xff08;好家伙缩写也是CL&#xff09; 1.continual l…

error: ‘CV_LOAD_IMAGE_UNCHANGED’ was not declared in this scope

1-错误 2-错误原因 opencv4.x以上&#xff0c;有些宏&#xff0c;API名字改了&#xff0c;需要改为新的 3-解决方案 CV_LOAD_IMAGE_UNCHANGED 改为 cv::IMREAD_UNCHANGEDCV_LOAD_IMAGE_GRAYSCALE 改为 cv::IMREAD_GRAYSCALECV_LOAD_IMAGE_COLOR 改为 cv::IMREAD_COLORCV_LO…

Win10,WinServer16,DNS,Web ,域 环境配置 周总结 (温故而知新 可以为师矣 第十五课)

Win10,WinServer16,DNS,Web ,域 环境安装 (第十五课) 创建虚拟机安装windowserver2016服务器(NETBASE第二课)_星辰镜的博客-CSDN博客 创建台虚拟机并安装上window10系统&#xff08;NETBASE 第一课&#xff09;_window 虚拟机_星辰镜的博客-CSDN博客配置通过域名访问网站(NET…

【5G PHY】5G 调制与编码策略(MCS)介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…