zoukankan      html  css  js  c++  java
  • C语言中的指针笔记

    1.为什么需要指针:

    • 指针的使用使得不同区域的代码可以轻易的共享内存数据。当然你也可以通过数据的复制达到相同的效果,但是这样往往效率不太好,因为诸如结构体等大型数据,占用的字节数多,复制很消耗性能。但使用指针就可以很好的避免这个问题,因为任何类型的指针占用的字节数都是一样的(根据平台不同,有4字节或者8字节或者其他可能)。
    • 指针使得一些复杂的链接性的数据结构的构建成为可能,比如链表,链式二叉树等等。
    • 有些操作必须使用指针。如操作申请的堆内存。
    • C语言中的一切函数调用中,实参传递给形参的机理都是“按值传递(pass by value)”,如果我们要在函数中修改被传递过来的对象,就必须通过这个对象的指针来完成。

    2.什么是指针:指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量。C语言中的数组是指 一类 类型,数组具体区分为 int 类型数组,double类型数组,char数组 等等。同样指针 这个概念也泛指 一类 数据类型,int指针类型,double指针类型,char指针类型等等。

    3.为什么程序中的数据会有自己的地址:操作系统将DRAM等硬件和软件结合起来,给程序员提供的一种对物理内存使用的抽象。这种抽象机制使得程序使用的是虚拟存储器,而不是直接操作物理存储器。所有的虚拟地址形成的集合就是虚拟地址空间。 由于内存中的每一个字节都有一个唯一的编号,因此,在程序中使用的变量,常量,甚至数函数等数据,当他们被载入到内存中后,都有自己唯一的一个编号,这个编号就是这个数据的地址。指针就是这样形成的。

    4.空指针:指向空,或者说不指向任何东西。在C语言中,我们让指针变量赋值为NULL表示一个空指针,而C语言中,NULL实质是 ((void*)0) , 在C++中,NULL实质是0。换种说法:任何程序数据都不会存储在地址为0的内存块中,它是被操作系统预留的内存块。

    5.坏指针:指针变量的值是NULL,或者未知的地址值,或者是当前应用程序不可访问的地址值,这样的指针就是坏指针,不能对他们做解指针操作,否则程序会出现运行时错误,导致程序意外终止。任何一个指针变量在做 解地址操作前,都必须保证它指向的是有效的,可用的内存块,否则就会出错。坏指针是造成C语言Bug的最频繁的原因之一。

    6.void*类型指针:由于void是空类型,因此void*类型的指针只保存了指针的值,而丢失了类型信息,我们不知道他指向的数据是什么类型的,只知道这个数据在内存中的起始地址,如果想要完整的提取指向的数据,程序员就必须对这个指针做出正确的类型转换,然后再解指针。前面已经提到过,数据的类型是正确解析出内存数据的关键,相同的内存数据以不同的数据类型去解析的时候,会得到不同的值。程序需要得到什么数据,不光要知道其地址,还要明确其类型,因此编译器不允许直接对void*类型的指针做解指针操作

    7.&是返回操作数地址的单目运算符,叫做取地址运算符。*是返回指定地址内变量的值的单目运算符,叫做指针运算符。

    8.字符数组和字符指针:字符指针可以指向一个字符串。字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址。以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写:"abc",那么编译器帮你存储的是"abc/0"。字符指针str与字符数组string的区别是:str是一个变量,可以改变str使它指向不同的字符串,但不能改变str所指的字符串常量。string是一个数组,可以改变数组中保存的内容。

    9.const char*是指向常量的指针,而不是指针本身为常量,可以不被初始化.该指针可以指向常量也可以指向变量,只是从该指针的角度而言,它所指向的是常量,通过该指针不能修改它所指向的数据。

    10.指针完全可以作为函数的参数进行传递,在C中,数组作为参数传递,跟指针作为参数传递都很类似的,指针传的是该指针指向的地址,而数组参数则是将该数组的首地址传递过去

    11.文件指针:在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。

    12.指针常量,常量指针

    什么是指针常量?指针常量即指针类型的常量。

    char *const a="John";
    a="abc";    //错误,a指针,不能变,一个指针类型的变量,存放的是地址,所以不能把'"abc"的地址赋给a
    char *b= a; //可以

    什么是常量指针?常量指针即是指向常量的指针,指针的值可以改变,指针所指的地址中的内容为常量不能改变。

    const char *a="John";
    char b[]="abc"; 
    a=b; //正确,name1存放的地址可以改变 char *c= a; //不可以,因为c 和 a存放的是同一块地址,如果c地址中的内容改了,则a的内容也改了,那么a就不再是指向常量的指针了。
  • 相关阅读:
    Flutter form 的表单 input
    FloatingActionButton 实现类似 闲鱼 App 底部导航凸起按钮
    Flutter 中的常见的按钮组件 以及自 定义按钮组件
    Drawer 侧边栏、以及侧边栏内 容布局
    AppBar 自定义顶部导航按钮 图标、颜色 以及 TabBar 定义顶部 Tab 切换 通过TabController 定义TabBar
    清空路由 路由替换 返回到根路由
    应对ubuntu linux图形界面卡住的方法
    [转] 一块赚零花钱
    [转]在树莓派上搭建LAMP服务
    ssh保持连接
  • 原文地址:https://www.cnblogs.com/kerwincui/p/14127126.html
Copyright © 2011-2022 走看看