C语言中指向指针的指针笔试题有哪些,给出示例代码并写上注释
时间: 2023-06-25 08:06:27 浏览: 159
指向指针的指针,又称为二级指针,是C语言中比较重要的概念之一,尤其在涉及到动态内存分配的情况下。以下是几个常见的指向指针的指针的笔试题:
1. 交换两个变量的值
示例代码:
```c
void swap(int **p, int **q) {
int *temp = *p;
*p = *q;
*q = temp;
}
int main() {
int a = 1, b = 2;
int *p = &a, *q = &b;
printf("Before swap: a=%d, b=%d\n", a, b);
swap(&p, &q);
printf("After swap: a=%d, b=%d\n", a, b);
return 0;
}
```
注释:swap函数接受两个指向指针的指针作为参数,通过解引用操作交换两个指针所指向的变量的值。在main函数中,定义了两个变量a和b,并分别取其地址赋值给指针p和q。调用swap函数时,需要传入p和q的地址,因为swap函数需要修改p和q所指向的变量。最后输出a和b的值,可以看到它们已经被成功交换了。
2. 动态分配二维数组
示例代码:
```c
int main() {
int **arr;
int n = 3, m = 4, i, j;
arr = (int **)malloc(n * sizeof(int *));
for (i = 0; i < n; i++) {
arr[i] = (int *)malloc(m * sizeof(int));
for (j = 0; j < m; j++) {
arr[i][j] = i * m + j;
}
}
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
for (i = 0; i < n; i++) {
free(arr[i]);
}
free(arr);
return 0;
}
```
注释:在main函数中,定义了一个指向指针的指针arr,用于存储动态分配的二维数组。首先分配n个int指针的空间,即arr的空间,然后分别为每个指针分配m个int的空间,即二维数组的每一行空间。接着,用两个for循环为每个元素赋值,最后输出数组中的值。注意,在释放内存时,需要先释放每一行的空间,再释放arr的空间。
3. 按照指定顺序输出链表
示例代码:
```c
struct Node {
int data;
struct Node *next;
};
void printList(struct Node **head) {
struct Node *cur, *prev, *next;
cur = *head;
prev = NULL;
while (cur != NULL) {
next = cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
*head = prev;
while (*head != NULL) {
printf("%d ", (*head)->data);
*head = (*head)->next;
}
}
int main() {
struct Node *head = NULL;
struct Node *n1, *n2, *n3;
n1 = (struct Node *)malloc(sizeof(struct Node));
n2 = (struct Node *)malloc(sizeof(struct Node));
n3 = (struct Node *)malloc(sizeof(struct Node));
n1->data = 1;
n2->data = 2;
n3->data = 3;
n1->next = n2;
n2->next = n3;
n3->next = NULL;
head = n1;
printList(&head);
return 0;
}
```
注释:定义了一个简单的链表结构体Node,包含一个数据成员data和一个指向下一个节点的指针next。printList函数接受一个指向指针的指针,用于修改链表头节点的指向,使链表反转。在链表反转完成后,再遍历链表输出每个节点的值。在main函数中,创建了一个包含3个节点的链表,并将头节点赋值给head。调用printList函数时,传入head的地址,用于修改head指针的值。最后输出链表中的元素。
阅读全文