C语言指针操作:复制字符串及应用

需积分: 50 1 下载量 108 浏览量 更新于2024-07-14 收藏 1.58MB PPT 举报
本资源是一份关于C语言编程的习题与教程,主要聚焦于指针的应用。习题10.7要求编写一个名为scopy的函数,该函数接收两个字符串指针,`psn`和`psm`,以及一个整数`m`,目标是将字符串`sn`从第`m`个字符开始的所有字符复制到`sm`。`main`函数中,首先定义了两个字符数组`sn`和`sm`,其中`sn`存储了一个示例字符串,`m`设为字符串长度的一半,然后调用scopy函数执行复制操作,并通过`printf`显示原始和复制后的字符串。 在这个过程中,指针起着关键作用。首先,指针是一个变量,它存储的是内存地址,允许程序员间接访问内存中的数据。在C语言中,`char *psn`和`char *psm`分别表示指向字符的指针,它们指向的是字符串中的字符位置。通过指针操作,我们可以动态地改变`psm`的位置,逐个复制`sn`中的字符。 在函数scopy中,`*(psn+m)`获取`sn`中的第`m`个字符的地址,然后`*(m+psn++)`将该字符赋值给`psm`所指向的位置,同时`psm++`递增指针以指向下一个位置。当复制完指定数量的字符后,设置`*psm`为'\0',以标记字符串的结束。 这段教程涵盖了以下几个知识点: 1. **指针基础**:理解指针的概念,包括指针变量,它是用来存储其他变量地址的变量;以及指针的使用,如直接访问和间接访问内存中的数据。 2. **数组和指针关系**:数组的元素可以通过其下标间接访问,相当于数组名是一个指向数组首元素的指针。理解数组指针的运用,如在本例中,`sn`和`sm`作为字符数组,实际上可以被视为指向数组第一个元素的指针。 3. **字符串指针**:字符串常量实际上是字符数组,因此字符串名也是一种指向字符的指针。这里的`sn`和`sm`都指向字符数组的第一个字符。 4. **函数指针**:虽然题目没有明确提到,但理解如何通过函数指针调用scopy这样的函数,也是指针应用的一个方面,即使函数scopy本身并不是一个函数指针。 5. **动态内存管理**:虽然此处没有涉及动态内存分配,但理解指针在动态内存管理中的作用,比如使用`malloc`或`calloc`等函数来创建和管理内存。 6. **数据结构表示**:指针使得数据结构的表示更加灵活,可以动态地表示链表、树等复杂数据结构。 通过解决这个习题,学习者可以进一步巩固对指针的理解,提高在C语言编程中的操作效率。

#include "config.h" #define FOSC 22118400L //System frequency uint32_t baud=9600; //UART baudrate uint8_t RX_BUF[50]; uint8_t NUM_1=0; /************************************************************************ �� �� ���� ���ڳ�ʼ�� ���������� STC10L08XE ��Ƭ�����ڳ�ʼ������ ���غ����� none ����˵���� none **************************************************************************/ void UartIni(void) { SCON = 0x50; //8-bit variable UART TMOD = 0x20; //Set Timer1 as 8-bit auto reload mode TH1 = TL1 = -(FOSC/12/32/baud); //Set auto-reload vaule TR1 = 1; //Timer1 start run ES = 1; //Enable UART interrupt EA = 1; //Open master interrupt switch } /************************************************************************ ���������� ���ڷ���һ�ֽ����� ��ڲ����� DAT:�����͵����� �� �� ֵ�� none ����˵���� none **************************************************************************/ void UARTSendByte(uint8_t DAT) { ES = 0; TI=0; SBUF = DAT; while(TI==0); TI=0; ES = 1; } /************************************************************************ ���������� ���ڷ����ַ������� ��ڲ����� *DAT���ַ���ָ�� �� �� ֵ�� none ����˵���� API ���ⲿʹ�ã�ֱ�ۣ� **************************************************************************/ void PrintCom(uint8_t *DAT) { while(*DAT) { UARTSendByte(*DAT++); } } void Uart_Isr() interrupt 4 using 1 { if (RI) { RI=0; RX_BUF[NUM_1]=SBUF; NUM_1++; if(NUM_1>=49) NUM_1=0; if(NUM_1>=3) { if(RX_BUF[NUM_1]==0xF8&&RX_BUF[NUM_1-1]==0xF8&&RX_BUF[NUM_1-2]==0xF8) IAP_CONTR=0x60; } } } 什么意思

2023-07-25 上传

static void nvme_calc_irq_sets(struct irq_affinity *affd, unsigned int nrirqs) { struct nvme_dev *dev = affd->priv; unsigned int nr_read_queues, nr_write_queues = dev->nr_write_queues; if (!nrirqs) { nrirqs = 1; nr_read_queues = 0; } else if (nrirqs == 1 || !nr_write_queues) { nr_read_queues = 0; } else if (nr_write_queues >= nrirqs) { nr_read_queues = 1; } else { nr_read_queues = nrirqs - nr_write_queues; } dev->io_queues[HCTX_TYPE_DEFAULT] = nrirqs - nr_read_queues; affd->set_size[HCTX_TYPE_DEFAULT] = nrirqs - nr_read_queues; dev->io_queues[HCTX_TYPE_READ] = nr_read_queues; affd->set_size[HCTX_TYPE_READ] = nr_read_queues; affd->nr_sets = nr_read_queues ? 2 : 1; }static int nvme_setup_irqs(struct nvme_dev *dev, unsigned int nr_io_queues) { struct pci_dev *pdev = to_pci_dev(dev->dev); struct irq_affinity affd = { //ָ���ж��׺��Եļ��㷽���Ͳ��� .pre_vectors = 1, .calc_sets = nvme_set_irq_affinity, //nvme_calc_irq_sets, .priv = dev, }; unsigned int irq_queues, poll_queues; poll_queues = min(dev->nr_poll_queues, nr_io_queues - 1); dev->io_queues[HCTX_TYPE_POLL] = poll_queues; dev->io_queues[HCTX_TYPE_DEFAULT] = 1; dev->io_queues[HCTX_TYPE_READ] = 0; irq_queues = 1; if (!(dev->ctrl.quirks & NVME_QUIRK_SINGLE_VECTOR)) irq_queues += (nr_io_queues - poll_queues); return pci_alloc_irq_vectors_affinity(pdev, 1, irq_queues, PCI_IRQ_ALL_TYPES | PCI_IRQ_AFFINITY, &affd); } 在 Linux 5.17.12 内核版本中,如何修改 pci_alloc_irq_vectors_affinity() 函数的 affinity_hint 参数来绑定 NVMe 驱动的所有 I/O 队列到同一 CPU 核心上。代码展示

2023-06-09 上传

static void nvme_calc_irq_sets(struct irq_affinity *affd, unsigned int nrirqs) { struct nvme_dev *dev = affd->priv; unsigned int nr_read_queues, nr_write_queues = dev->nr_write_queues; if (!nrirqs) { nrirqs = 1; nr_read_queues = 0; } else if (nrirqs == 1 || !nr_write_queues) { nr_read_queues = 0; } else if (nr_write_queues >= nrirqs) { nr_read_queues = 1; } else { nr_read_queues = nrirqs - nr_write_queues; } dev->io_queues[HCTX_TYPE_DEFAULT] = nrirqs - nr_read_queues; affd->set_size[HCTX_TYPE_DEFAULT] = nrirqs - nr_read_queues; dev->io_queues[HCTX_TYPE_READ] = nr_read_queues; affd->set_size[HCTX_TYPE_READ] = nr_read_queues; affd->nr_sets = nr_read_queues ? 2 : 1; }static int nvme_setup_irqs(struct nvme_dev *dev, unsigned int nr_io_queues) { struct pci_dev *pdev = to_pci_dev(dev->dev); struct irq_affinity affd = { //ָ���ж��׺��Եļ��㷽���Ͳ��� .pre_vectors = 1, .calc_sets = nvme_set_irq_affinity, //nvme_calc_irq_sets, .priv = dev, }; unsigned int irq_queues, poll_queues; poll_queues = min(dev->nr_poll_queues, nr_io_queues - 1); dev->io_queues[HCTX_TYPE_POLL] = poll_queues; dev->io_queues[HCTX_TYPE_DEFAULT] = 1; dev->io_queues[HCTX_TYPE_READ] = 0; irq_queues = 1; if (!(dev->ctrl.quirks & NVME_QUIRK_SINGLE_VECTOR)) irq_queues += (nr_io_queues - poll_queues); return pci_alloc_irq_vectors_affinity(pdev, 1, irq_queues, PCI_IRQ_ALL_TYPES | PCI_IRQ_AFFINITY, &affd); } 在 Linux 5.17.12 内核版本中,可以通过修改 pci_alloc_irq_vectors_affinity() 函数的 affinity_hint 参数来绑定 NVMe 驱动的所有 I/O 队列到同一 CPU 核心上。

2023-06-09 上传