我是靠谱客的博主 雪白汽车,最近开发中收集的这篇文章主要介绍指针的本质分析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

      • *号的意义
      • &号的意义
      • 传值调用与传址调用
      • 常量与指针

变量回顾:程序中的变量只是一段存储空间的别名,那么是不是必须通过这个别名才能使用这段存储空间?

*号的意义

通过一个指针访问它所指向的地址的过程称为间接访问或借引用指针。这个用于指向间接访问的操作符是单目操作符 *
1. 在指针声明时,* 号表示所声明的变量为指针。
2. 在指针使用时,* 号表示取指针所指向的内存空间中的值。

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

指针定义并初始化,与指针定义然后赋值的区别
指针定义时可以初始化,指针的初始化其实就是给指针变量初值(跟普通变量的初始化没有任何区别)
1. 指针变量定义同时初始化格式是: int a = 32; int * p = &a;
2. 不初始化指针变量先定义再赋值是: int a = 32; int * p; p = &a;

注:赋值并不是 *p = &a; 这是错误的,因为 *p 代表访问指向变量地址里面的值!

&号的意义

取地址符使用时直接加在一个变量前面,然后取地址符和变量加起来构成一个新的符号,这个符号表示这个变量的地址。

示例代码:指针使用示例

#include <stdio.h>

int main()
{
    int i = 0;
    int* pI;
    char* pC;
    float* pF;

    pI = &i;

    *pI = 10;

    printf("%p, %p, %dn", pI, &i, i);
    printf("%d, %d, %pn", sizeof(int*), sizeof(pI), &pI);
    printf("%d, %d, %pn", sizeof(char*), sizeof(pC), &pC);
    printf("%d, %d, %pn", sizeof(float*), sizeof(pF), &pF);

    return 0;
}

输出结果
00AFF99C, 00AFF99C, 10
4, 4, 00AFF990
4, 4, 00AFF994
4, 4, 00AFF998

从输出结果我们可以得出结论:
(1) 从打印pI和&i的值,我们得知:指针变量pI 存储的值为指向变量i 的地址。
(2) 从pI = 10;和输出变量i的值,我们得知:需要访问变量i 地址里面的值需要使用间接访问操作符
(3) 从打印sizeof(int*),sizeof(char*),sizeof(float*)的值,我们得知:指针变量的大小都为4个字节,这是因为在32位系统中,存储一个地址需要用到4个字节的大小。

传值调用与传址调用

  1. 指针式变量,也因此可以声明指针参数
  2. 当一个函数体内部需要改变实参的值,则需要使用指针参数
  3. 函数调用时实参值将复制到形参
  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 = %dn", aa, bb);

    swap(&aa, &bb);

    printf("aa = %d, bb = %dn", aa, bb);

    return 0;
}

输出结果
aa = 1, bb = 2
aa = 2, bb = 1

常量与指针

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;
}

最后

以上就是雪白汽车为你收集整理的指针的本质分析的全部内容,希望文章能够帮你解决指针的本质分析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部