c语言基础—指针与数组

来源:互联网 发布:软件行业就业方向 编辑:程序博客网 时间:2024/05/01 02:43

前面提到指针是值为地址的数据类型。数据类型存储在有地址编号的内存上,通过指针可以高效的访问相关变量。

1、  指针的声明与赋值

指针对不同数据类型的地址有不同的声明方式。如int *p;表明p是一个指向int型变量的指针,即p的值为int型变量的地址。一般声明方式为数据类型 *p;表明p是一个指向该数据类型变量的指针。

其中*称为间接运算符,用来获取相关指针所指地址的值。

还有一个地址运算符&,用来获取变量的地址。

对指针的初始化可以直接int *p = &a;//其中假设a为一个int型变量。因为指针保存的值是地址。在声明指针int *p;后,p = &a;表明对p赋值为变量a的地址。

                  总结一下,简单的指针声明和赋值及对应地址的关系如下:

                            char c = ‘A’;//声明字符变量c为’A’;假设变量c在内存中的地址为0x000d

                  char*p;//声明一个指向字符变量的指针,假设p在内存中的地址为0x000f,此

时p的值不确定。(不一定为空)

                            p = &c;//把c的地址赋给p,此时p的值为0x000d

则:

                            c表示c的值,即’A’

                            &c表示c的地址,即0x000d

                           p表示p的值,即0x000d

                            *p表示取p指向的地址0x000d的值,即’A’

                            &p表示p的地址,即0x000f

当改变*p的值时,相当于改变c的值。如 *p = ‘B’;则此时c的值为’B’。这种用法在调用函数时可以用来改变传递参数的值(实际上改变的也不是形参,而是形参所指地址的值)。

 

2、  数组

数组是一组相同类型的元素构成的组合。

int a[10];声明了一个由10个int型数据组成的数组,且10个数据在内存中按顺序存储。这里面有一些文章,在声明了一个数组后,用a[i](其中i为0到9的数字)来表示相应位置上的int型数据。那么a的类型又是什么?在c中,所有的数组的数组名是一个指向数组第一个元素地址的常量指针。A是常量指针,因此其值不可改变。

         数组的赋值一般由初始化完成。

如:

int a[3] = {1,2,3};

当[]内没有数字时,编译器会自动为数组分配足够初始化的空间大小。当{}内的元素小于数组个数时,不足的元素赋值为0。

例:

                  inta[] = {1,2,3,4};//数组a有4个元素

                  intb[10] = {1};//数组b有10个元素,b[0] = 1,其他元素为0

                  b[2]= 2;//对上面的数组b的第三个元素赋值为2。

注意非声明时,数组[]内的数字为编号,数组第一个元素编号为0。声明时[]内的数字为数组个数。

 

3、  数组与指针

数组和指针有什么关系呢?可以用指针来访问数组的元素。

如:

char a[] = “abcd”;//声明字符数组a,初始化为”abcd”

char *p;//声明指向字符变量的指针p

p = a;//这里因为a为数组名,是一个指向数组受元素的常量指针,

因此有 a = &a[0],可以直接将a赋值给p

通过对指针加数字n相当于指针指向的地址移动n个数据长度的位,因为数组中地址是顺序的,因此通过这种操作可以访问a中的所有元素。

有:

p:值为a[0]的地址

*p:a[0]的值

(p + 2):值为a[2]的地址

                            *(p + 2):a[2]的值

 

4、  指针的初始化

通过指针可以间接改变指针所指地址的值。因此对指针的初始化很重要。

如:

                   int*p;

                   *p= 12;

这是一种很危险的用法。又不存在语法错误。在声明指针的时候没有初始化一个值,因此编译器在分配给p空间的时候p的值便为该空间本来存在的值,如果改值是符合地址形式,则对*p的赋值会改变该地址的值,从而引起一些不可预期的变化。因此在用指针间接访问时,应确保指针已初始化。

可:

                   int*p = NULL;

                   *p= 12;

则编译器会提示错误。NULL是一个空指针,将p初始化为空指针时,表明p未指向任何东西。当对p进行间接访问时便提示错误。

 

5、  指针的指针

指针的值为变量的地址,那么指针的值可以是指针的地址吗?答案是可以的。

int **p;

表示p是一个指向int型指针的指针。即p的值为int型指针的地址。

                  如:

                           inta = 1;

                           int*b = &a;

                           int**c = &b;

                  有:

                           **c= *b = a = 1;

                           *c= b = &a;

                           c= &b;

分析:b为指向a的指针;c为指向b的指针,即c为指向a指针的指针。C为指针,可以知道c的值为地址,因此*c 为c所指地址的值。C指向b,因此,*c为b的值,b也是指针,故*c的值也为地址,有等式*c== b == &a,*(*c)可以用来取*c地址上的值,有等式*(*c) ==*(b) == a。

         

原创粉丝点击