C语言指针教程:函数参数中的指针与数组交换

需积分: 50 1 下载量 183 浏览量 更新于2024-07-14 收藏 1.58MB PPT 举报
"这篇教程主要介绍了指针变量作为函数参数的使用,以及在C语言中指针相关的概念,包括指针、指针变量、数组的指针、指针数组、字符串指针、指针函数和函数指针。教程强调了指针在程序设计中的重要性,如简化代码、高效处理数据结构、动态内存分配和多返回值等功能。" 在C语言中,指针是一个关键特性,它允许程序员直接操作内存地址,从而提高程序的灵活性和效率。指针变量是一个存储其他变量地址的变量,这个地址被称为指针。例如,在`swap`函数的例子中,函数接受两个整型指针`p1`和`p2`,通过它们来交换对应的值,而不是直接交换变量的值。这样做是因为在C语言中,函数不能直接返回多个值,但可以通过指针参数来改变函数外部的变量状态。 指针的定义通常包含两部分:指针变量的存储类型(如`int`、`char`等)和它所指向的目标变量的数据类型。例如,`int *p`定义了一个指向整型变量的指针`p`。使用`*`运算符来表示这是一个指针变量,而不是进行乘法操作。 数组的指针是指向数组首元素的指针,而指针数组则是一组指针,每个指针可以分别指向不同的变量或数组。例如,如果有一个整型数组`int arr[10]`,那么`int *arr_ptr`就是一个指向数组`arr`首元素的指针,而`int (*ptr_array)[10]`则是一个指针数组,每个元素都是一个能指向包含10个整数的数组的指针。 字符串在C语言中实际上是以字符数组的形式存在的,因此,字符串指针可以用来指向一个字符数组的首字符,实现对字符串的操作。例如,`char *str`就是一个指向字符数组(即字符串)的指针。 指针函数是返回一个指针的函数,而函数指针则是指向函数的指针。函数指针可以用来作为参数传递给其他函数,或者在运行时动态调用函数,增加了代码的灵活性。 在程序设计中,熟练使用指针可以实现更复杂的数据结构,比如链表、树等,并且能够动态分配内存,这对于创建大容量数据结构或处理不确定大小的数据非常有用。此外,通过指针,函数也能获取并改变多个返回值,使得代码更简洁高效。 理解和掌握指针是深入学习C语言的关键,它提供了对内存直接操作的能力,使得程序设计更加灵活且高效。通过使用指针,程序员能够更好地控制数据的存储和访问,从而构建出功能强大的程序。

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 上传