C语言中数组与指针的关系

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]又是多少呢,会不会报错呢,这个问题,我希望留给大家自己编个小程序试试,就知道了,在这里就不说了。

http://www.bkjia.com/Cyy/1296603.htmlwww.bkjia.comtruehttp://www.bkjia.com/Cyy/1296603.htmlTechArticleC语言中数组与指针之间关系,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]又是多少呢,会不会报错呢,这个问题,我希望留给大家自己编个小程序试试,就知道了,在这里就不说了。