提示信息

C语言指针详解第五部分(包含易错笔试题)

残花败柳 已关注

在C语言中,指针是一个非常重要且强大的概念。以下是关于C语言指针的第五部分详细解说,包括一些常见的易错笔试题。

指针高级特性

1. 指针的算术运算

指针可以进行算术操作,如加减法。在C中,指针的加法和减法是以指针所指向的数据类型的大小为步长单位的。

  1. int arr[] = {10, 20, 30, 40};
  2. int *ptr = arr;
  3. ptr++; // 现在 ptr 指向 arr[1],即值为 20

2. 指向指针的指针(多级指针)

指针不仅可以指向基本数据类型,还可以指向其他指针。这就形成了多级指针。

  1. int num = 10;
  2. int *ptr = #
  3. int **ptr2 = &ptr;

这里,ptr2 是一个指向指针的指针,它可以通过 *ptr2 得到 ptr 的值,或者通过 **ptr2 来获取 num 的值。

3. 常量指针(指向常量的指针 & 指针常量)

  • 常量指针(指向常量的指针,即不能通过该指针修改值):
    const int *ptr = # // *ptr = 20; // 错误:不允许修改 num = 20; // 允许通过其它途径修改
  • 指针常量(指针的值是常量,即指针始终指向初始化时的变量):
    int *const ptr = # // ptr = &another_num; // 错误:不允许修改指针的指向 *ptr = 30; // 允许通过该指针修改指向的值

4. 函数指针

指针不仅可以指向数据,还可以指向函数,从而实现回调和函数的动态调用。

  1. int add(int a, int b) {
  2. return a + b;
  3. }
  4. int (*funcPtr)(int, int) = add;
  5. int result = funcPtr(2, 3); // 调用 add 函数

易错笔试题解析

题目1:指针和数组的差别

  1. void func(int arr[]) {
  2. printf("%ld\n", sizeof(arr) / sizeof(int));
  3. }
  4. int main() {
  5. int arr[10];
  6. printf("%ld ", sizeof(arr) / sizeof(int)); // 输出数组长度
  7. func(arr); // 输出什么?
  8. return 0;
  9. }

解析:在main中,sizeof(arr)10 * sizeof(int),输出10。而在func中,arr相当于一个指针指向数组的首元素,sizeof(arr)是指针的大小(通常是4或8字节),输出不等于10。

题目2:二级指针解引用

  1. int main() {
  2. int num = 10;
  3. int *ptr = #
  4. int **ptr2 = &ptr;
  5. **ptr2 = 20;
  6. printf("%d\n", num); // 输出什么?
  7. return 0;
  8. }

解析**ptr2num 的值,通过ptr2的解引用可以修改num。所以输出是20。

题目3:指针越界访问

  1. int main() {
  2. int arr[3] = {1, 2, 3};
  3. int *ptr = arr + 3;
  4. printf("%d\n", *ptr); // 输出什么?
  5. return 0;
  6. }

解析ptr指向arr之外的存储区域,*ptr结果是未定义行为,可能会导致程序错误崩溃或输出垃圾值。

理解和掌握这些指针知识以及常见的误用,可以帮助避免在编程时犯错误。希望这部分内容对你在理解C语言指针时有所帮助!

    遇到难题? "AI大模型GPT4.0、GPT" 是你的私人解答专家! 点击按钮去提问......
残花败柳 关注 已关注

最近一次登录:2024-11-20 17:50:15   

暂时还没有签名,请关注我或评论我的文章
×
免费图表工具,画流程图、架构图