博客
关于我
C语言指针的那些子事儿
阅读量:390 次
发布时间:2019-03-05

本文共 1631 字,大约阅读时间需要 5 分钟。

C语言入门学习指南

1. 指针基础概念

指针是计算机编程中至关重要的概念,它代表内存地址。一个变量的地址就是该变量的指针。简单来说,指针变量存储的是内存中某一位置的地址。

  • 指针变量的定义与用途

    指针变量用于存储内存地址,类似于电话本中的电话号码。它可以让程序访问内存中的数据,完成数据的读写操作。

  • 指针表示法

    int * pointer 表示 pointer 是一个整数类型的指针变量,可以存储其他内存地址。&i 用于获取变量 i 的地址,pointer = &i 表示将 i 的地址赋值给 pointer


2. 指针与 scanf 函数

scanf 函数用于从标准输入读取数据,但需要注意以下几点:

  • 字符数组存储

    scanf 可以直接将字符数组赋值,但不能直接赋值给指针变量。

  • 数组与指针的区别

    字符串数组的名字其实就是指向数组起始地址的指针。数组名可以直接用于 scanf 函数,而指针变量需要事先分配内存。

  • 内存分配与使用

    使用 scanf 赋值字符串指针时,必须先分配内存。这可以通过以下方式实现:

    char *name = (char *)malloc(100); // 分配100字节内存scanf("%s", name); // 读取并存储字符串free(name); // 释放内存

3. 小知识点解析

  • 指针变量与内存地址的关系

    指针变量存储的是内存地址,但指针本身并不等同于地址。

  • 指针变量的可变性

    指针变量存储的地址可以随意修改,但修改后的地址可能指向无效内存,导致程序崩溃。

  • 函数参数与指针

    函数接收指针作为参数时,函数内部会自动将指针转换为相应类型的指针变量。

  • 字符串字面量与指针的区别

    字符串字面量不是变量,而是直接嵌入到程序中的常量。

  • 指针操作的含义

    *pointer 表示取出指针变量 pointer 所指的内存地址中的值。

  • 不同类型指针的内存分配

    • int 类型指针会分配4字节内存。
    • char 类型指针会分配1字节内存。

  • 4. 实践练习

    (1)输入两个整数并按顺序输出

    int a, b;scanf("%d %d", &a, &b);printf("a=%d, b=%d\n", a, b);

    (2)实现交换两个整数

    int x, y;x = 10;y = 20;// 通过指针交换变量int *p = &x;int *q = &y;int temp = *p;*p = *q;*q = temp;printf("x=%d, y=%d\n", x, y);

    (3)输入三个整数并输出它们的和

    int a, b, c;scanf("%d %d %d", &a, &b, &c);printf("总和为:%d\n", a + b + c);

    5. 动态内存管理

    malloc.h 与内存分配

    • malloc 函数

      分配指定字节大小的内存:

      void *malloc(size_t size);

      返回值:指向分配内存的起始地址。

    • calloc 函数

      分配多个大小为 size 的内存块,并初始化为0:

      void *calloc(size_t count, size_t size);
    • 内存释放

      使用 free 函数释放分配的内存,并设置指针为 NULL

      free(arr);arr = NULL;

    6. 指针与数组的关系

    • 数组名实际上是一个指针,指向数组的起始地址。
    • scanf 可以直接读取数组,但指针变量需要事先分配内存。

    7. 指针的深度理解

    • 双重指针

      int **q; // 指向整数类型的指针变量int *p = &a; // p 是指向整数 a 的指针q = &p; // q 是指向整数 a 的地址指针

      *q 获取 p 的地址,*p 获取 a 的值。

    • 内存分配与释放

      动态分配内存时,确保释放内存以避免内存泄漏。


    通过以上内容的学习与实践,你应该能够掌握指针的基础概念、scanf 函数的使用规则以及动态内存管理的方法。

    转载地址:http://bewzz.baihongyu.com/

    你可能感兴趣的文章
    Notadd —— 基于 nest.js 的微服务开发框架
    查看>>
    NOTE:rfc5766-turn-server
    查看>>
    Notepad ++ 安装与配置教程(非常详细)从零基础入门到精通,看完这一篇就够了
    查看>>
    Notepad++在线和离线安装JSON格式化插件
    查看>>
    notepad++最详情汇总
    查看>>
    notepad++正则表达式替换字符串详解
    查看>>
    notepad如何自动对齐_notepad++怎么自动排版
    查看>>
    Notes on Paul Irish's "Things I learned from the jQuery source" casts
    查看>>
    Notification 使用详解(很全
    查看>>
    NotImplementedError: Cannot copy out of meta tensor; no data! Please use torch.nn.Module.to_empty()
    查看>>
    NotImplementedError: Could not run torchvision::nms
    查看>>
    nova基于ubs机制扩展scheduler-filter
    查看>>
    Now trying to drop the old temporary tablespace, the session hangs.
    查看>>
    nowcoder—Beauty of Trees
    查看>>
    np.arange()和np.linspace()绘制logistic回归图像时得到不同的结果?
    查看>>
    np.power的使用
    查看>>
    NPM 2FA双重认证的设置方法
    查看>>
    npm build报错Cannot find module ‘webpack/lib/rules/BasicEffectRulePlugin‘解决方法
    查看>>
    npm build报错Cannot find module ‘webpack‘解决方法
    查看>>
    npm ERR! ERESOLVE could not resolve报错
    查看>>