C语言 从根本上理解指针

 更新时间:2022年04月19日 10:29:53   作者:清风自在 流水潺潺  
C语言这门课程在计算机的基础教学中一直占有比较重要的地位,然而要想突破C语言的学习,对指针的掌握是非常重要的,本文将具体针对指针的基础做详尽的介绍

一、* 的意义

  • 在指针声明时,* 号表示所声明的变量为指针
  • 在指针使用时,* 号表示取指针所指向的内存空间中的值

如下:

int i = 0;
int j = 0;
int* p = &i; //指针声明
j = *p; //取值

变量 p 保存着变量 i 的内存地址,即:p <--> &i *p <--> i

* 号类似一把钥匙,通过这把钥匙可以打开内存,读取内存中的值。

下面看一个指针的使用示例:

#include <stdio.h>
int main()
{
    int i = 0;
    int* pI;
    char* pC;
    float* pF;
    
    pI = &i;
    
    *pI = 10;
    
    printf("%p, %p, %d\n", pI, &i, i);
    printf("%d, %d, %p\n", sizeof(int*), sizeof(pI), &pI);
    printf("%d, %d, %p\n", sizeof(char*), sizeof(pC), &pC);
    printf("%d, %d, %p\n", sizeof(float*), sizeof(pF), &pF);
    
    return 0;
}

输出结果如下:

所有 32 位系统上的指针变量占用内存大小都为 4 个字节。

二、传值调用与传址调用

  • 指针是变量,因此可以声明指针参数
  • 当一个函数体内部需要改变实参的值,则需要使用指针参数
  • 函数调用时实参值将复制到形参
  • 指针适用于复杂数据类型作为参数的函数中

下面看一个利用指针交换变量的代码:

#include <stdio.h>
 
int swap(int* a, int* b)
{
    int c = *a;
    
    *a = *b;
    
    *b = c;
}
 
int main()
{
    int aa = 1;
    int bb = 2;
    
    printf("aa = %d, bb = %d\n", aa, bb);
    
    swap(&aa, &bb);
    
    printf("aa = %d, bb = %d\n", aa, bb);
    
    return 0;
}

输出结果如下:

三、常量与指针

const int* p;    //p 可变,p 指向的内容不可变
int const* p;    //p 可变,p 指向的内容不可变
int* const p;    //p 不可变,p 指向的内容可变
const int* const p;    //p 和 p 指向的内容都不可变

口诀:左数右指

当 const 出现在 * 号左边时指针指向的数据为常量,当 const 出现在 * 后右边时指针本身为常量

下面通过一个例子加深理解:

#include <stdio.h>
 
int main()
{
    int i = 0;
    
    const int* p1 = &i;
    int const* p2 = &i;
    int* const p3 = &i;
    const int* const p4 = &i;
    
    *p1 = 1;    // compile error
    p1 = NULL;  // ok
    
    *p2 = 2;    // compile error
    p2 = NULL;  // ok
    
    *p3 = 3;    // ok
    p3 = NULL;  // compile error
    
    *p4 = 4;    // compile error
    p4 = NULL;  // compile error
    
    return 0;
}

输出结果如下:

四、小结

  • 指针是 C 语言中一种特别的变量
  • 指针所保存的值是内存的地址
  • 可以通过指针修改内存中的任意地址内容

到此这篇关于C语言 从根本上理解指针的文章就介绍到这了,更多相关C语言 指针内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ 单链表的基本操作(详解)

    C++ 单链表的基本操作(详解)

    下面小编就为大家带来一篇C++ 单链表的基本操作(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C++ 递归遍历文件并计算MD5的实例代码

    C++ 递归遍历文件并计算MD5的实例代码

    在本篇文章里小编给大家整理的是一篇关于C++ 递归遍历文件并计算MD5的实例代码,有兴趣的朋友们可以学习参考下。
    2021-07-07
  • c++中数字与字符串之间的转换方法(推荐)

    c++中数字与字符串之间的转换方法(推荐)

    下面小编就为大家带来一篇c++中数字与字符串之间的转换方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • 插入排序算法之希尔排序+直接插入排序

    插入排序算法之希尔排序+直接插入排序

    这篇文章主要介绍了插入排序算法之希尔排序+直接插入排序的相关知识,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • Qt定时器(QTimer)的3种使用方法

    Qt定时器(QTimer)的3种使用方法

    本文主要介绍了Qt定时器(QTimer)的3种使用方法,主要包括QObject类提供的定时器,QTimer类提供的定时器,静态的singleShot ()函数创建单触发定时器,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • C++关于字符的接收与输出操作示例

    C++关于字符的接收与输出操作示例

    这篇文章主要介绍了C++关于字符的接收与输出操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01
  • C++实现LeetCode(135.分糖果问题)

    C++实现LeetCode(135.分糖果问题)

    这篇文章主要介绍了C++实现LeetCode(135.分糖果问题),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言实现飞机游戏(豪华版)的示例代码

    C语言实现飞机游戏(豪华版)的示例代码

    在前文中已经实现了基础版和进阶版的飞机游戏,但是存在的问题很明显:已经发射出去的子弹会随着飞机位置的实时改变而改变,并且不能实现连发。本篇文章将利用数组进一步改进空战游戏,感兴趣的可以了解一下
    2022-10-10
  • 深入浅析C++中的#,##,和

    深入浅析C++中的#,##,和

    这篇文章主要介绍了C++中的#,##,和"的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-09-09
  • C语言菜鸟基础教程之判断

    C语言菜鸟基础教程之判断

    C语言判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)
    2017-10-10

最新评论