数组指针,指针数组是学习指针和数组最让人头疼的名词,下面是学习分享,不足之处,望指正,相互学习!
直接上代码
//以下是在32位操作系统中编译运行
#include<stdio.h>
void main(void)
{
int array[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; //定义一个指向int型的array二维数组
int (*ptr)[4]=NULL;//定义一个指向占有4个元素的数组指针ptr
int *ptr1=NUll,*ptr2=NULL,*ptr3=NULL;//定义三个int型指针并初始化为NULL
ptr=array;
ptr1=(int *)array;
ptr2=array[0];
ptr3=&array[0][0];
printf("\narray=%p",array);
printf("\nptr=%p\tptr+1=%p",ptr,ptr+1);
printf("\nptr1=%p\tptr1+1=%p",ptr1,ptr1+1);
printf("\nptr2=%p\tptr2+1=%p",ptr2,ptr2+1);
printf("\nptr3=%p\tptr3+1=%p",ptr3,ptr3+1);
}
编译运行后的结果如下:
1.array是一个二级指针,指向array[0],array[0]占16个字节的数组,因此array+1,则以array[0]为基地址向后移16个字节。
2. ptr在声明时,是一个指向四个元素的数组指针,当ptr指向array时,ptr仍是一个指向四个元素的数组指针,因此,指向array时,以array[0]为基准,向后移16个字节,不妨将ptr声明为(int *ptr)[3],ptr=array,假设可以编译运行,那么ptr+1,则是以array[0]为基地址向后移12个字节。
3. ptr1声明一个指向int型的指针且指向NULL,这是声明指针时需要记住的,为什么ptr=(int *)array,因为要保证指针指向的维数一致,否则编译器会提示warning。这样写是将array强制转换为指向int型的指针,我们知道指针占一个字节,因此ptr1+1以arra[0]为基地址向后移动4个字节。
4.ptr2指向array[0],大家会误认为,ptr2应该跟array[0]一样,指向占4个元素的数组指针,其实类似于ptr1,ptr2也只是一个指向int型的指针,因此,ptr2+1是以array[0]为基地址向后移动4个字节。
5.ptr3取的array第一个元素的地址,也是array的首地址,但ptr3同时也是一个指向int 型的指针,那ptr3+1以array[0][0]为基地址向后移动4个字节。
可能有些人会纳闷,那如果ptr1或者ptr2,亦或者ptr3是一个指向short型的指针呢,其它的赋值操作不便,那么ptr1+1,ptr2+1,ptr3+1指向的地址又会是什么呢?有兴趣的可以自己手动编译运行下。其结果均是以array[0]为基地址向后移动2个字节。