C语言面试之旅:掌握基础,探索深度(面试实战之c语言指针&数组下篇)

        没有什么人能一路单纯到底,但是要记住,别忘了最初的自己。

                                                                                                                                             ----小新

一、引言

        在C语言中,指针是一种特殊的数据类型,它存储的是内存地址。指针在C语言编程中扮演着重要的角色,能够有效地提高程序的效率灵活性。理解并掌握指针的概念和运用对于学习C语言的人来说是至关重要的。

二.关键要点

  1. 内存地址指针存储一个内存地址,该地址指向计算机内存中的某个位置。
  2. 指向指针可以指向内存中的数据,这可以是基本数据类型(如整数、字符)或复杂的数据结构(如数组、结构体)。
  3. 解引用:通过解引用指针,可以访问指针所指向的内存地址上的值。解引用操作使用 * 符号。
  4. 地址运算指针可以进行地址运算,例如指针加法减法,以访问相邻内存位置。
  5. 动态内存分配:指针在动态内存分配中非常有用,允许程序在运行时分配和释放内存,避免静态内存分配的限制。
  6. 传递参数指针允许将变量的地址传递给函数,以便在函数内部修改变量的值。

(1)使用指针的好处

  1. 指针可以动态分配内存
  2. 在链表中可以方便修改链表的节点
  3. 解析字符串
  4. 相同类型的指针可以直接复制

(2)调用Free释放内存后,指针还能用吗

        Free释放掉内存后,只是把内存的使用权就被归还给系统,内存里面的东西可能被清除也可能是垃圾值,但是指向这个内存的指针还是指向这块内存,并不会NULL

(3)指针不能加指针

        指针之间可以做减法,但不能做加法

(4)空指针是指指向地址为0的地方

三、指针的基本概念

(1)指针的定义

        一个指针是一个变量,它存储了另一个变量的内存地址。这个被存储的地址指向了实际的数据值。

int *ptr;  // 定义一个整型指针变量ptr

(2)指针的赋值

        使用"&"运算符获取一个变量的地址,然后将这个地址赋值给一个指针变量。例如,如果我们有一个变量"int num = 10;",我们可以通过"int *ptr = &num"来创建一个指向num的指针。

int num = 10;  
int *ptr = #  // 将ptr指向num的地址

(3)通过指针访问变量

        使用"*"运算符来通过指针访问它所指向的变量。例如,"*ptr"就表示访问ptr所指向的变量

int num = 10;  
int *ptr = #  
printf("%d", *ptr);  // 输出10*,ptr表示访问ptr所指向的变量的值

(4) 指针的指针

int num = 10;  
int *ptr1 = #  
int **ptr2 = &ptr1;  // ptr2是一个指向指针变量的指针变量,它指向ptr1  
printf("%d", **ptr2);  // 输出10**,ptr2表示访问ptr2所指向的指针变量所指向的变量的值

 (5)指针在函数参数传递中的应用

        在C语言中,函数参数传递有两种方式:传值方式传地址方式。传值方式是将变量的值传递给函数,而传地址方式则是将变量的地址传递给函数。传地址方式通常使用指针来实现。

void swap(int *a, int *b) {  
    int temp = *a;  
    *a = *b;  
    *b = temp;  
}  // 通过指针传递变量的地址,实现交换两个变量的值

(6)指针在动态内存分配中的应用

         使用malloc()calloc()realloc()等函数分配内存后,会返回一个指向分配内存的首地址的指针。通过这个指针可以访问和操作这块内存。 

int *ptr = (int*)malloc(sizeof(int));  // 分配一个整型大小的内存空间,并将指针ptr指向该空间的地址  
*ptr = 10;  // 在该空间存储一个整数10  
printf("%d", *ptr);  // 输出10,访问该空间存储的值  
free(ptr);  // 释放该内存空间

四.指针的运用

  1. 函数参数传递:在C语言中,函数参数通常是通过值传递的,这意味着函数会接收到参数的副本。但是,如果我们希望函数能够直接修改原始数据,那么就需要通过指针来实现。例如,如果我们有一个函数"void increment(int *num)",那么这个函数就可以直接修改num的值。
  2. 动态内存分配:C语言中的malloc、calloc和realloc函数返回一个指向分配内存的指针。这些函数允许我们在运行时动态地创建和释放内存,这对于构建复杂的程序结构来说是非常重要的。
  3. 数组操作:在C语言中,数组名实际上就是一个指向数组第一个元素的指针。因此,我们可以使用指针来操作数组,例如通过指针来遍历数组或者修改数组元素的值

五、注意事项

        在使用指针时,我们需要小心确保我们不会访问无效或者未分配内存地址,因为这可能会导致程序崩溃或者未定义的行为。此外,当我们使用完一个动态分配的内存块后,我们需要使用free函数来释放这个内存块,以避免内存泄漏。

六、结论

        指针是C语言的一个重要特性,它提供了一种直接高效的方式来操作内存实现复杂的数据结构。理解并掌握指针的概念和运用,对于提高你的C语言编程技能是至关重要的。同时,正确地使用指针也是避免出现内存问题和程序崩溃的关键。

你可能感兴趣的:(c语言,开发语言,面试,青少年编程,职场和发展)