欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言中数组与指针之间关系

程序员文章站 2022-05-13 16:08:16
在C语言学习中,指针应用属于其精髓部分之一,很多初学者在这部分容易学的模模糊糊,今天我准备说的只是在C语言里面指针和数组变量之间的关系,在说它们之间关系前我先介绍两个概念,一个是指...
在C语言学习中,指针应用属于其精髓部分之一,很多初学者在这部分容易学的模模糊糊,今天我准备说的只是在C语言里面指针和数组变量之间的关系,在说它们之间关系前我先介绍两个概念,一个是指针不可修改,一个是通过指针不可修改,这两个概念什么意思呢我们通过代码说明:

1.int *const p1 = &i;

2.int const* p2=&i;

我们可以发现p1与p2仅仅在定义时const与*前后位置不同,但其意义是不一样的,1中的代码表示指针不可修改,什么是指针不可修改呢,就是指针一旦被赋值指向某个地址,就不能

再令它指向另一个地址,比如再对1中指针进行P1++操作就是错误的,但它指向地址里的内容是能改变的,比如你可以 *p++ ; 或其他整数值;

而 2 中的代码表示通过指针不可修改,意思就是你不能通过指针修改指针所指向地址里的内容,即你不能通过P2指针对 i 进行改变,比如这样的操作就是错误的:*P++; 而这里你可

以修改指针,比如进行这样的操作:p++;

那么我们再来看这样一种写法:3.const int *p = &i; 这种写法意义跟2是一样的

总结:const 在 * 前,通过指针不可修改,在 * 后,指针本身不能被修改

那么我们再来看数组

我们先来看这样一段简短的代码:

1.int arr[5]={0,1,2,3,4} ;

2.int buff[10]={5,6,7,8,9} ;

3.void test(int arr[],const int buff[])

{

...........//省略

}

4.int *p = arr[3] ;

5.a = p[-2] ;

我们知道,数组名本身就是指针,且它指向内容与数组的第一个元素一样,即 arr == &arr[0]; 我们知道通常两个指针*p ,*q,之间是可以进行这样的操作的p = q;但是数组之间就不可

以,我们不能令:arr = buff;或者&arr[5] = &buff[10];这是因为数组一旦定义好之后,系统就会为它开辟一片固定的地址,我们不能再对地址做任何更改,可以看到,这与我们的指

针不可修改是一致的,我们同样不能有 arr++;这样的语句,所以我们在想用指针改变数组值时通常是如下:

int *p2 = arr[];//p2指向arr[0]

p2++;//p2指向arr[1]

~~~这样说我们就清楚了,数组其实是一种特殊的指针,特殊在他的指针不能被修改,固定指向一个地址。

此外我们注意到上面的 3 代码,我们在将数组名作为参数时,传递的实际上就是指针,那么里面的第二个参数const int buff[]什么意思呢,与本篇开头说明的一致,假设

int *p = buff[];函数里面相当于const int *p;即通过指针不可修改,我们传进来数组buff[]的指针,在函数里面我们不能通过这个指针修改buff数组的内容。这种写法对于保护我们的数

时有用。

理解了数组即是指针我们就能理解4、5代码了,我们知道数组下标不能越界比如上面arr[-1]就不对,但当我们令*p = arr[3]时我们却能有p[-2]这样的表达式存在,原因是指针也可以

进行[]操作,且如上例,那么p[-2]是多少呢,事实上,由于指针p初始指向arr[3]地址,p[-2]相当于p -= 2;即指向了arr[1]的地址。

那么如果p[-5]又是多少呢,会不会报错呢,这个问题,我希望留给大家自己编个小程序试试,就知道了,在这里就不说了。