• 介绍 变量 指针 引用


    变量都有一个声明和赋值的过程。

    • 声明(申请一块内存区域保存数据)。
    • 赋值(内存中填入具体的数据)。

    指针类型变量 存储的数据是一个(存储变量的地址)。

    • 每个指针都对应着一个数据类型。
    • 使用 *(间接访问操作符)可以获得指针变量存储地址里的数据。
    • 使用 &(取地址符)可以获得变量的地址,赋值给指针类型变量。

    总结:指针与变量的区别:指针变量存放的是某一类型变量在内存中的虚拟地址,普通变量存储的是某一类型数据。

    介绍:如下图 1 可以得到这样的结论,指针变量和普通变量基本相同。

    1 #include <stdio.h>
    2 #include <stdlib.h>
    3 int main(){
    4     char *p;
    5     char a = 'H';
    6     p = &a;
    7     return 0;
    8 }
    指针变量

     

    引用:引用是一个变量的别名,对引用的操作与对变量直接操作完全一样。C++中的概念 C语言中没有。

    引用和指针的区别

    • 引用被创建时必须被初始化。而指针则可以在任何时候被初始化。
    • 引用初始化后不可以被改变,而指针则可以改变。
    • 指针可以进行算数运算,引用不可以。
    • 指针可以有多级,但是引用只能是一级。

    函数调用参数传递的形式

    引用传递是C++才有的特性,C语言只支持值传递。所以C语言只能通过传指针来达到在函数内修改函数外变量的功能。也就是swap(int &a,int &b)在C语言中是错的,swap(int *a,int *b)是对的。

    部分指针悬挂情况

    指针指向非法的内存地址,那么这个指针就是悬挂指针,也叫野指针

    初始化不正确

     //把352赋值给p3,一是类型不匹配,再者如果真的赋值成功(用强制转换)那么p3指向的地址是352,这个地址不一定是可用的。
    int* p = 352;   
     
    //这段代码编译没错,向p3指向的地址中放入352这个数,但是p3的值没有初始化,它指向的地址不确定,所以p3现在是野指针,运行时也可能程序崩溃。  
    int *p;
    *p = 352;  

    函数返回局部变量

    1 //指针指向某个对象之后,当这个对象的生命周期已经结束,对象已经消亡后,仍使用指针访问该对象,将出现运行时错误。
    2 int* retAddr(){
    3     int num=10;
    4     return &num;
    5 }

    多次清空,访问清空数据等

    //多次清空
    x = malloc(N * sizeof(int));
    free(x);
    y = malloc(M * sizeof(int));
    free(x);
    
    //非法访问
    x = malloc(N * sizeof(int));
    free(x);
    y = malloc(M * sizeof(int));
    for (i = 0; i < M; i++)
        y[i] = x[i]++;

    C++中引用传递与指针传递区别(进一步整理

  • 相关阅读:
    学习java随笔第二篇:java开发工具——Eclipse
    GDB
    【转】图像分割(Image Segmentation)
    [转]C#Windows窗体打开图像与保存
    【转】opencv 分水岭算法cvWatershed
    C#中Rectangle(Point, Size) 和Rectangle(Int32, Int32, Int32, Int32) 区别
    【转】数组和图像的转换
    .Net的垃圾回收机制(GC)之拙见——托管类型的垃圾回收
    【动态规划】滚动数组的求解(C++)
    C#编程语言之委托与事件(二)—— C#事件
  • 原文地址:https://www.cnblogs.com/yweihum/p/8663134.html
Copyright © 2020-2023  润新知