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就不再是指向常量的指针了。

 

posted @ 2020-12-12 22:23  kerwin cui  阅读(253)  评论(0编辑  收藏  举报