指针与数组
指针可以与变量结合,也可以与数组结合使用。指针数组和数组指针是两个截然不同的概念,指针数组是一种数组,该数组存放的是一组变量的地址。数组指针是一个指针,表示该指针是指向数组的指针。
1.指向数组元素的指针
int a[5]={1,2,3,4,5};
int *p=a; //int *p=&a[0];
如上代码,指针变量p指向了a数组的首元素,其方法可有两种,int *p=a或int *p=&a[0];
注意:指针变量的类型应与指针所指向的变量的类型一致,如下代码会报错
/* int *p;
float x=3.14; 指针变量的类型应和所指向的变量类型一致。
p=&x; 否则会报错
*/
与整型、浮点型数据一样,指针也可以进行算术运算,但含义却不同。当一个指针加一或减一并不是使指针增加1或减少一,而是使指针所指向的位置向后或向前移动了一个位置。例如执行a=a+3,如果一个整型占用4个字节,则相加后a=2000+4*3=2012(这里假设指针a的初值为2000)。同样指针也可进行自加自减运算。
也可以用一个指针变量减去另一个指针变量,具体看如下代码和结果:
int *p,*q,b;
int shuzu[6]={0,1,2,3,4,5};
p=shuzu,q=&shuzu[3];
printf("p和q两指针的地址分别为:%d %d",&p,&q);
printf("\np和q两指针的值为(即所指向元素的地址为):%d %d",p,q);
b=p-q;
printf("\nb的值为:%d ",b); //b=两指针值相减的差除以4
结果为:
2.指针数组
指针数组其实也是一个数组,只是数组中的元素是指针类型的数据。换句话说,指针数组中的每一个元素都是一个指针变量。
定义指针数组的方式如下:
int *p[4];
由于[ ]运算符优先级比*高,p优先与[ ]结合,从而形成一个数组,然后再与*结合,表示该数组是指针类型的,每个数组元素是一个指向整型的变量 。
指针数组常常用于储存一些长度不等的字符串数据,有的读者可能会问,为什么不存放在二维数组中?因为如将这些字符串若放在二维数组中,就需要定义一个能容纳最长字符串的数组长度,这样就会浪费一些空间。下面看我的代码,上面有注释。
#include<stdio.h>
int main()
{
/*二维数组方式存放长度不一的字符串 */
int i,n=2;
char shuzu[2][9]={"my love","my hobby"}; //9为最小长度,不然报错,数组[1]别忘了末尾有个'\0',
//所以长度为8+1=9
printf("%s\n",shuzu);
puts(shuzu[1]); //puts(shuzu)会报错
/* 指针数组存放长度不一的字符串*/
char *s[2]={"my love","my hobby"};
for(i=0;i<2;i++)
printf("第%d个元素为:%s\n",i,s[i]);
char *p;
// for(p=s[0];p<s[0]+2;p++)
// printf("%s",p);
/*p自加后并不是往后移了一个单位*/
p=s[0];
printf("%s\n",p);
p++;
printf("%s\n\n",p);
/*正确方式1*/
printf("\n通过指向数组的指针输出字符串:\n");
for(p=s[0],i=0;i<n;p=s[i])
{
printf("第%d个字符串:%s\n",i+1,p);
i++;
}
/*正确方式二*/
printf("\n用数组名输出指针数组:\n");
for(i=0;i<2;i++)
printf("%s\n",s[i]);
}
运行结果:
...........