C语言指针面试题
发布人:shili8
发布时间:2024-12-29 19:46
阅读次数:0
**C语言指针面试题**
### 一、什么是指针?
在 C语言中,指针是一种特殊的变量,它存储的是另一个变量或常量的内存地址。通过使用指针,可以间接地访问和操作被指向的变量。
### 二、指针的基本概念* **指针的定义**: `int *p;`,其中 `int` 是指针所指向的类型,`*p` 表示这是一个指针。
* **指针的赋值**: `p = &x;`,其中 `&x` 得到变量 `x` 的内存地址,并将其赋给指针 `p`。
* **指针的使用**: `*p =10;`,通过解引用符号 `*`,可以得到指针 `p` 所指向的变量的值。
### 三、指针运算在 C语言中,指针可以进行加法和减法运算。例如:
cint arr[5] = {1,2,3,4,5}; int *p = arr; // p 指向 arr 的第一个元素printf("%d ", *p); // 输出1// 将指针 p 移动到下标为2 的位置p +=2; printf("%d ", *p); // 输出3
### 四、指针和数组在 C语言中,数组名实际上是一个指向数组首元素的指针。例如:
cint arr[5] = {1,2,3,4,5}; printf("%d ", *arr); // 输出1
### 五、指针和函数在 C语言中,函数可以返回一个指针类型的值。例如:
cint *find_max(int arr[], int size) { int max = arr[0]; for (int i =1; i < size; i++) { if (arr[i] > max) { max = arr[i]; } } return &max; } int main() { int arr[] = {1,2,3,4,5}; int *p = find_max(arr, sizeof(arr) / sizeof(arr[0])); printf("%d ", *p); // 输出5 return0; }
### 六、指针和内存管理在 C语言中,使用指针需要注意内存的释放。例如:
cint *malloc(int size) { int *ptr = malloc(size); if (ptr == NULL) { printf("Memory allocation failed "); return NULL; } return ptr; } int main() { int *p = malloc(sizeof(int)); if (p != NULL) { *p =10; free(p); //释放内存 } else { printf("Memory allocation failed "); } return0; }
### 七、指针和多线程在 C语言中,使用指针需要注意多线程的安全性。例如:
c#include <pthread.h> int *shared_var = NULL; void *thread_func(void *arg) { shared_var = malloc(sizeof(int)); if (shared_var != NULL) { *shared_var =10; } else { printf("Memory allocation failed "); } return NULL; } int main() { pthread_t thread; pthread_create(&thread, NULL, thread_func, NULL); pthread_join(thread, NULL); if (shared_var != NULL) { printf("%d ", *shared_var); // 输出10 free(shared_var); } else { printf("Memory allocation failed "); } return0; }
### 八、指针和智能指针在 C++ 中,使用智能指针可以避免手动释放内存。例如:
cpp#include <memory> class SmartPtr { public: template <typename T> explicit SmartPtr(T *ptr) : ptr_(ptr) {} ~SmartPtr() { delete ptr_; } T &operator*() const { return *ptr_; } T *operator->() const { return ptr_; } private: T *ptr_; }; int main() { int *p = new int(10); SmartPtr sp(p); printf("%d ", *sp); // 输出10 return0; }
### 九、指针和容器在 C++ 中,使用容器可以避免手动释放内存。例如:
cpp#include <vector> int main() { std::vector<int> vec = {1,2,3}; printf("%d ", vec[0]); // 输出1 return0; }
### 十、指针和迭代器在 C++ 中,使用迭代器可以避免手动释放内存。例如:
cpp#include <vector> int main() { std::vector<int> vec = {1,2,3}; auto it = vec.begin(); printf("%d ", *it); // 输出1 return0; }
### 总结在 C语言中,指针是一种特殊的变量,它存储的是另一个变量或常量的内存地址。通过使用指针,可以间接地访问和操作被指向的变量。在 C++ 中,使用智能指针、容器和迭代器可以避免手动释放内存。
### 参考* 《C语言程序设计》(第3 版)
* 《C++ Primer》(第5 版)
* 《Effective C++》(第2 版)