指针与数组概念、指针数组、数组指针详解

指针与数组

指针可以与变量结合,也可以与数组结合使用。指针数组和数组指针是两个截然不同的概念,指针数组是一种数组,该数组存放的是一组变量的地址。数组指针是一个指针,表示该指针是指向数组的指针。

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]);             
} 

运行结果:

...........

 


 

 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值