今天,我们简单说一下指针与数组的配合使用。
当我们声明一个数组的时候,数组被编译器认为是一个地址,即数组名指向我们声明数组时开辟的空间的开头。
再回到指针,假如已经声明了一个数组 int a[],执行 int *p=a; 之后,指针p就指向了数组的开头,然后就可以通过指针实现对数组的操作。
问题很自然的就来了,如果指针p指向数组开头,那么 执行 p++; 之后,p 向后移动了几个字节? 如果p一开始就指向了一个 char 型数组,又会是什么情况?
正所谓“类型为王”(这个很重要!),既然指针p指向了一个 int 型数组,p++ 也就会自动向后移动四个字节,指向下一个操作数,如果指向 char 类型,就会向后移动一个字节。有些初学者可能会有这样的迷惑,指针的大小不是4字节吗,为什么会移动一个字节?很简单,我们应该明确指针的作用,指针有“指向”作用,指向的是具体类型的数据,所以移动的字节大小自然依据所指类型变换。
代码:
1 int i; 2 3 int int_a[3]={1,2,3}; 4 char char_a[3]={'a','b','c'}; 5 6 int *p_int=int_a; //point to type 'int' 7 char *p_char=char_a; //point to type 'char' 8 9 for(i=0;i<3;i++) 10 { 11 printf("p_int:0x%x\n",p_int); 12 13 p_int++; 14 } 15 16 printf("\n\n\n"); 17 18 for(i=0;i<3;i++) 19 { 20 printf("p_char:0x%x\n",p_char); 21 22 p_char++; 23 }