C语言中指针的初始化赋值方法(c语言,开发技术)

时间:2024-05-06 17:15:22 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

    C%E8%AF%AD%E8%A8%80%E4%B8%AD%E6%8C%87%E9%92%88%E7%9A%84%E5%88%9D%E5%A7%8B%E5%8C%96%E8%B5%8B%E5%80%BC%E6%96%B9%E6%B3%95

1、指针的初始化

2、指针的赋值

3、指针常量

4、指针初始化补充

5、void *型指针

6、指向指针的指针

比如:

假设:

则编译器(vs2008)会提示The variable 'p' is being used without being initialized.即使用了未初始化的变量p。

由于p是指向7所在的地址,*p = 7给p所指向的内存赋值,p没有赋值,所以p所指向的内存位置是随机的,没有初始化的。

指针的赋值,“=”的左操作数能够是*p,也能够是p。

数组的变量名b表示该数组的首地址,因此p=b;也是正确的

同类型的指针赋值:

备注:字符串与指针的初始化和赋值

初始化:

赋值:

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

ANSI C定义了零指针常量的概念:一个具有0值的整形常量表达式,或者此类表达式被强制转换为void *类型,则称为空指针常量,它能够用来初始化或赋给不论什么类型的指针。也就是说,我们能够将0、0L、'/0'、2–2、0*5以及(void *)0赋给一个不论什么类型的指针,此后这个指针就成为一个空指针,由系统保证空指针不指向不论什么对象或函数。

ANSI C还定义了一个宏NULL,用来表示空指针常量。大多数C语言的实现中NULL是採用后面这样的方式定义的:#defineNULL((void *)0)。

对指针进行初始化时经常使用的有下面几种方式:

採用NULL或空指针常量,如:int *p = NULL;或char *p = 2-2;或float *p = 0;

取一个对象的地址然后赋给一个指针,如:int i = 3;int *ip = &i;

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

将一个T类型数组的名字赋给一个同样类型的指针,如:char ary[100]; char *cp = ary;

将一个指针的地址赋给一个指针,如:int i = 3;int *ip = &i;int **pp = &ip;

将一个字符串常量赋给一个字符指针,如:char *cp = “abcdefg”;

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

ANSI C定义了一种void *型指针,表示定义一个指针,但不指定它指向何种类型的数据。void *型指针作为一种通用的指针,能够和其他不论什么类型的指针(函数指针除外)相互转化而不须要类型强制转换,但不能对它进行解引用及下标操作。C语言中的malloc函数的返回值就是一个void *型指针,我们能够把它直接赋给一个其他类型的指针,但从安全的编程风格角度以及兼容性上讲,不妨将返回的指针强制转换为所需的类型,另外,malloc在无法满足请求时会通过返回一个空指针来作为“内存分配失败”的信号,所以要注意返回值指针的判空。

在指针初始化的第5种方式中提到了用一个指针的地址来初始化一个指针。回顾一下上一讲的内容:指针是一种变量,它也有自己的地址,所以它本身也是可用指针指向的对象。我们能够将指针的地址存放在还有一个指针中,如:

此时的ppi即是一个指向指针的指针

i的地址为108,pi的内容就是i的地址,而pi的地址为104,ppi的内容即是pi的地址。对ppi解引用照常会得到ppi所指的对象,所获得的对象是指向int型变量的指针pi。想要真正地訪问到i.,必须对ppi进行两次解引用,如以下代码所看到的:

以上三条语句的输出均为5000。

本文:C语言中指针的初始化赋值方法的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:如何使用evolview美化进化树下一篇:

2 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18