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]又是多少呢,会不会报错呢,这个问题,我希望留给大家自己编个小程序试试,就知道了,在这里就不说了。
上一篇: c语言:在屏幕上输出图案