博客
关于我
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/

    你可能感兴趣的文章
    OpenCV:不规则形状区域中每种颜色的像素数?
    查看>>
    OpenCV:概念、历史、应用场景示例、核心模块、安装配置
    查看>>
    OpenDaylight融合OpenStack架构分析
    查看>>
    OpenERP ORM 对象方法列表
    查看>>
    openEuler Summit 2022 成功举行,开启全场景创新新时代
    查看>>
    openEuler 正式开放:推动计算多样化时代的到来
    查看>>
    OpenEuler23.03欧拉系统_安装瀚高数据库企业版6.0.4_openeuler切换root用户_su:拒绝权限_passwd: 鉴定令牌操作错误---国产瀚高数据库工作笔记001
    查看>>
    OpenEuler23.03欧拉系统_安装瀚高数据库企业版6.0.4_踩坑_安装以后系统无法联网_启动ens33网卡---国产瀚高数据库工作笔记002
    查看>>
    OpenFeign 入门与实战
    查看>>
    OpenFeign源码学习
    查看>>
    OpenFeign的使用方式成功解锁
    查看>>
    OpenFeign组件声明式服务调用
    查看>>
    openfeign远程调用不起作用解决_使用Spring Boot的spring.factories进行注入---SpringCloud Alibaba_若依微服务框架改造---工作笔记007
    查看>>
    openfire开发(四)消息拦截器
    查看>>
    openfire源码解读之将cache和session对象移入redis以提升性能
    查看>>
    Openfire身份认证绕过漏洞复现+利用(CVE-2023-32315)
    查看>>
    OpenForest 开源项目安装与使用指南
    查看>>
    OpenGL glBlendFunc() 设置颜色混合 透明度叠加计算
    查看>>
    OpenGL 中“立即模式”是什么意思?
    查看>>
    opengl 教程(15) 摄像机控制(2)
    查看>>