活动介绍
file-type

用指向指针的指针实现字符串排序

PPT文件

下载需积分: 50 | 1.58MB | 更新于2024-07-14 | 37 浏览量 | 1 下载量 举报 收藏
download 立即下载
本篇文档主要讲解如何使用C语言中的指针数组来实现排序功能,特别是在第十章“指针及其相关概念”的背景下。首先,理解指针和指针变量至关重要,它们是程序中用来存储内存地址的重要工具。指针是一个变量,其值是另一个变量的地址,而指针变量则是专门用来存储其他指针的变量。 在C程序设计中,指针的应用包括: 1. **简洁性和效率**:通过指针可以直接操作内存,避免了复制大量数据,提高代码执行效率。 2. **数据结构表示**:指针能有效表示复杂的数据结构,如链表、树等。 3. **动态内存管理**:指针可以动态地分配和释放内存,增加了程序的灵活性。 4. **函数返回多个值**:函数可以通过指针返回多个值,而非通常的单值返回。 在习题10.20中,我们有以下关键知识点: - **`#define LINEMAX 20`**:定义了一个常量,用于限制字符串的最大长度,确保内存管理的合理性。 - **`main()`函数中的初始化**:声明了一个二维字符数组`str`存储5个字符串,一个指针数组`pstr`存储这些字符串的首地址,以及一个指针变量`p`指向`pstr`。 - **输入字符串**:使用`scanf`函数接收用户输入的5个字符串,并将它们的地址存储到`pstr`中。 - **`sort(p)`**:这是一个未定义的函数,可能需要实现一个自定义的排序算法,如冒泡排序、快速排序或归并排序,但使用的是指向指针的指针`p`作为参数,意味着排序算法会作用于`pstr`指向的字符串数组。 - **输出排序后的字符串**:通过`printf`函数输出排序后的字符串数组。 这部分内容着重考察了指针数组的使用,特别是如何通过一个指向指针的指针来操作整个数组元素。这在编程中是一种高级技巧,尤其是在处理大量数据时,可以显著简化代码结构和内存管理。此外,还涉及到对指针的基本概念如变量地址、指针对象、直接访问与间接访问的理解和实际操作。 学习者需要熟悉指针与指针变量的基本语法,掌握如何通过指针数组操作内存,以及如何运用这些概念来实现排序功能。这对于深入理解C语言和其他底层编程语言至关重要。

相关推荐

filetype

#include "User_Task.h" #include "main.h" #include "FreeRTOSConfig.h" #include "FreeRTOS.h" #include "task.h" #include "Detect_Task.h" #include "referee_data.h" #include "delay.h" #include "PWM.h" #include "laser.h" /*------------------------------------------------------*/ /* �û��ṹ����� */ /*------------------------------------------------------*/ static user_control_t user_control; /*------------------------------------------------------*/ /* �û���̬�������� */ /*------------------------------------------------------*/ static void user_control_init(user_control_t *user_control_init); static void cover_control(user_control_t *cover_control); static void laser_control(user_control_t *cover_control); /*------------------------------------------------------*/ /* �û������� */ /*------------------------------------------------------*/ void user_task(void *pvParameters) { //�ж�ң��������״̬ while (toe_is_error(DBUSTOE)) { vTaskDelay(USER_CONTROL_TIME_MS); } //�û������ʼ�� user_control_init(&user_control); while (1) { //���տ��ؿ��� cover_control(&user_control); //����ʿ��ؿ��� laser_control(&user_control); vTaskDelay(USER_CONTROL_TIME_MS); } } /*------------------------------------------------------*/ /* �û������ʼ�� */ /*------------------------------------------------------*/ static void user_control_init(user_control_t *user_control_init) { //��ȡң����ָ�� user_control_init->User_RC = get_remote_control_point(); //��ȡ����ϵͳָ�� user_control_init->User_referee = get_referee_data_point(); //����Ĭ�Ϲر� user_control_init->cover_state = COVER_OFF; } /*------------------------------------------------------*/ /* ���տ���ʵ�� */ /*------------------------------------------------------*/ static void cover_control(user_control_t *cover_control) { static uint8_t RC_Flag =0; static uint8_t cover_State =0; //ң�������� if(switch_is_mid(cover_control->User_RC->rc.s[COVER_SWITCH])) { RC_Flag = 0; } else if (switch_is_down(cover_control->User_RC->rc.s[COVER_SWITCH]) && RC_Flag == 0 ) { if(cover_State == 0) cover_State = 1; else if(cover_State == 1) cover_State = 0; RC_Flag = 1; } //���̿��� if( (cover_control->User_RC->key.v & COVER_CONTROL_KEY) ) { cover_on(); cover_control->cover_state = COVER_ON; } else { if(cover_State == 0) { cover_off(); cover_control->cover_state = COVER_OFF;} if(cover_State == 1) { cover_on(); cover_control->cover_state = COVER_ON; } } } /*------------------------------------------------------*/ /* ����ʿ���ʵ�� */ /*------------------------------------------------------*/ static void laser_control(user_control_t *cover_control) { if(toe_is_error(DBUSTOE)) { laser_off(); } else { laser_on(); } } /*------------------------------------------------------*/ /* ��ȡ���տ���״̬ */ /*------------------------------------------------------*/ uint8_t get_cover_state(void) { return user_control.cover_state; } 解释一下代码

filetype

#include "dht11.h" #include "main.h" void DHT11_IO_OUT (void){ //�˿ڱ�Ϊ��� GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = DHT11_DA_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); } void DHT11_IO_IN (void){ //�˿ڱ�Ϊ���� GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = DHT11_DA_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); } void DHT11_RST (void){ //DHT11�˿ڸ�λ��������ʼ�źţ�IO���ͣ� DHT11_IO_OUT(); HAL_GPIO_WritePin(GPIOC,DHT11_DA_Pin, GPIO_PIN_RESET); HAL_Delay(20); //��������18ms HAL_GPIO_WritePin(GPIOC,DHT11_DA_Pin, GPIO_PIN_SET); delay_us(30); //��������20~40us } uint8_t Dht11_Check(void){ //�ȴ�DHT11��Ӧ������1:δ��⵽DHT11������0:�ɹ���IO���գ� uint8_t retry=0; DHT11_IO_IN();//IO������״̬ while (HAL_GPIO_ReadPin(GPIOC,DHT11_DA_Pin)&&retry<100){//DHT11������40~80us retry++; delay_us(1); } if(retry>=100)return 1; else retry=0; while (!HAL_GPIO_ReadPin(GPIOC,DHT11_DA_Pin)&&retry<100){//DHT11���ͺ���ٴ�����40~80us retry++; delay_us(1); } if(retry>=100)return 1; return 0; } uint8_t Dht11_ReadBit(void){ //��DHT11��ȡһ��λ ����ֵ��1/0 uint8_t retry=0; while(HAL_GPIO_ReadPin(GPIOC,DHT11_DA_Pin)&&retry<100){//�ȴ���Ϊ�͵�ƽ retry++; delay_us(1); } retry=0; while(!HAL_GPIO_ReadPin(GPIOC,DHT11_DA_Pin)&&retry<100){//�ȴ���ߵ�ƽ retry++; delay_us(1); } delay_us(40);//�ȴ�40us //�����жϸߵ͵�ƽ��������1��0 if(HAL_GPIO_ReadPin(GPIOC,DHT11_DA_Pin))return 1; else return 0; } uint8_t Dht11_ReadByte(void){ //��DHT11��ȡһ���ֽ� ����ֵ������������ uint8_t i,dat; dat=0; for (i=0;i<8;i++){ dat<<=1; dat|=Dht11_ReadBit(); } return dat; } uint8_t DHT11_Init (void){ //DHT11��ʼ�� DHT11_RST();//DHT11�˿ڸ�λ��������ʼ�ź� return Dht11_Check(); //�ȴ�DHT11��Ӧ } uint8_t DHT11_ReadData(uint8_t *h){ //��ȡһ������//ʪ��ֵ(ʮ���ƣ���Χ:20%~90%) ���¶�ֵ(ʮ���ƣ���Χ:0~50��)������ֵ��0,����;1,ʧ�� uint8_t buf[5]; uint8_t i; DHT11_RST();//DHT11�˿ڸ�λ��������ʼ�ź� if(Dht11_Check()==0){ //�ȴ�DHT11��Ӧ for(i=0;i<5;i++){//��ȡ5λ���� buf[i]=Dht11_ReadByte(); //�������� } if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]){ //����У�� *h=buf[0]; //��ʪ��ֵ����ָ��1 h++; *h=buf[2]; //���¶�ֵ����ָ��2 } }else return 1; return 0; } #ifndef DHT11_DHT11_H_ #define DHT11_DHT11_H_ #include "stm32h7xx_hal.h" #include "../delay/delay.h" void DHT11_IO_OUT (void); void DHT11_IO_IN (void); void DHT11_RST (void); uint8_t Dht11_Check(void); uint8_t Dht11_ReadBit(void); uint8_t Dht11_ReadByte(void); uint8_t DHT11_Init (void); uint8_t DHT11_ReadData(uint8_t *h); #endif /* DHT11_DHT11_H_ */ #include "main.h" #include "adc.h" #include "dac.h" #include "usart.h" #include "gpio.h" #include "fmc.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "../../icode/led/led.h" #include "../../icode/key/key.h" #include "../../icode/delay/delay.h" #include "../Inc/retarget.h" #include "../../icode/usart/usart.h" #include "../../icode/dht11/dht11.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MPU_Config(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ uint8_t DHT11_BUF[2]={0}; /* USER CODE END 1 */ /* MPU Configuration--------------------------------------------------------*/ MPU_Config(); /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_ADC1_Init(); MX_DAC1_Init(); MX_FMC_Init(); MX_USART1_UART_Init(); MX_USART2_UART_Init(); MX_USART3_UART_Init(); /* USER CODE BEGIN 2 */ RetargetInit(&huart1); HAL_UART_Receive_IT(&huart1,(uint8_t*)&USART1_NewData,1); HAL_Delay(500); DHT11_Init(); HAL_Delay(1500); DHT11_ReadData(DHT11_BUF); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { DHT11_ReadData(DHT11_BUF); printf("湿度:%02d%% 温度:%02d℃\r\n",DHT11_BUF[0],DHT11_BUF[1]); HAL_Delay(1500); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Supply configuration update enable */ HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY); /** Configure the main internal regulator output voltage */ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0); while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {} /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 5; RCC_OscInitStruct.PLL.PLLN = 192; RCC_OscInitStruct.PLL.PLLP = 2; RCC_OscInitStruct.PLL.PLLQ = 2; RCC_OscInitStruct.PLL.PLLR = 2; RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2; RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE; RCC_OscInitStruct.PLL.PLLFRACN = 0; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2 |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2; RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2; RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) { Error_Handler(); } } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /* MPU Configuration */ void MPU_Config(void) { MPU_Region_InitTypeDef MPU_InitStruct = {0}; /* Disables the MPU */ HAL_MPU_Disable(); /** Initializes and configures the Region and the memory to be protected */ MPU_InitStruct.Enable = MPU_REGION_ENABLE; MPU_InitStruct.Number = MPU_REGION_NUMBER0; MPU_InitStruct.BaseAddress = 0x0; MPU_InitStruct.Size = MPU_REGION_SIZE_4GB; MPU_InitStruct.SubRegionDisable = 0x87; MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0; MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS; MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE; MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE; MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE; MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE; HAL_MPU_ConfigRegion(&MPU_InitStruct); /* Enables the MPU */ HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT); } /** * @brief This function is executed in case of error occurrence. * @retval None */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); while (1) { } /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ 运行代码后串口显示数据均为0

辰可爱啊
  • 粉丝: 29
上传资源 快速赚钱