指针的初始化和一些常见类型的指针

指针初始化时,“=”的右操作数必须为内存中数据的地址,不能够是变量,
int*p=0;除外,该语句表示指针为空。

在编译过程中,不能通过对没有初始化的指针的引用,
没有初始化的指针,简称野指针,可能会乱指,指向一些无关紧要的区域问题是不大的,但是,如果指向一些重要的内存区域,就可能引起数据丢失。试想一下,你去遛狗,溜的一只是一只没经驯养的野狗,一只是被调教极好的贵族狗,哪个安全一点呢。
ex:典型不能通过的错法:

int *p;
p=13;
没有初始化,野狗,可能会咬伤程序。

聊聊字符串和指针之间。

正确的初始化:

char *a="cxk";

这个初始化过程,是将指针a指向字符串的首地址,而并非传递字符串的值。由于,
在C语言里面,没有总体处理一个字符串的机制.

正确的赋值:

a="cxk";

错误的赋值:

*a="cxk";
字符串常量传递的是它的首地址,不能够通过*a改动该字符串的值,
由于该字符串为常量,而它仅仅是简单的将指针指向该字符串常量

3、指针常量
在C语言中没有一种内建(built-in)的方法去表示指针常量,所以当我们使用它的时候通常先写成整型常量的形式,然后再通过强制类型转换把它转换成对应的类型,如:int * , double * , char *等。

所以后面所看到的的做法是不行的: int *p = 0x12345678 ; 正确的方式应为:int *p = (int *) 0x12345678; 要注意指针中仅仅能存放地址,不能将一个非0值整型常量表达式或者其它非地址类型的数据赋给一个指针,原因就在此。

在大多数计算机中,内存地址确实是以无符号整型数来表示的,并且多以16进制表示,但我们在C语言中不能用整型数去表示地址,仅仅能用指针常量来表示,由于它是被用来赋给一个指针的。

对于这个赋值问题还能够换一个角度去理解,在C语言中,使用赋值操作符时,赋值操作符左边和右边的表达式类型应该是同样的,假设不是,赋值操作符将试图把右边表达式的值转换为左边的类型。所以假设写出int *p = 0x12345678 ; 这条语句编译器会报错:
’=’ : cannot convert from ’ const int ’ to ’ int * ’ ,
由于赋值操作符左边和右边的表达式的类型应该同样,而0x12345678是int型常量,p是一个指向int型的指针,两者类型不同,所以正确的方式是:int *p = (int *) 0x12345678 ;

前面也说了,可以给些地址的常量赋值给指针的,(标重点:好像要是十六进制才行!)
ex:

扫描二维码关注公众号,回复: 6011106 查看本文章

一个指针常量赋给一个指针,如:long *p = (long *)0xfffffff0;

实质:
对指针进行初始化或赋值的实质是将一个地址或同类型(或相兼容的类型)的指针赋给它,而无论这个地址是怎么取得的。要注意的是:对于一个不确定要指向何种类型的指针,在定义它之后最好把它初始化为NULL,并在解引用这个指针时对它进行检验,防止解引用空指针。另外,为程序中不论什么新创建的变量提供一个合法的初始值是一个好习惯,它能够帮你避免一些不必要的麻烦。

4.指针的指针

这个也是不难理解滴!

指针是一种变量,它也有自己的地址,所以它本身也是可用指针指向的对象。
我们能够将指针的地址存放在还有一个指针中。

也就是说,可以这样看,
指针原来存的的是一个变量的地址,
指针原来的地址,
存到另外一个指针去。
因为指针也是一个变量。

int i;
int *p,**pp;
p=&i;
pp=&p;

这个时候,要引用i的值,
可以

*p
**pp

猜你喜欢

转载自blog.csdn.net/qq_43504939/article/details/89504055