C语言指针-数组(二)

指向数组元素的指针

优先级:数组名后面的 [ ] 和 ( ) 具有相同的优先级,它们的优先级高于 *.

int a[10]; int *p; p=&a[0](和p=a等价) ;

C语言规定数组名代表数组中首元素的地址,首地址a是个指针常量。(p=&a[0]与p=a等价作用是把数组a的首元素的地址赋给指针变量“p”,而不是“把数组a各个元素的值赋值给“p”。)

int *p; p=&a[0] ; 这两句合在一起简写:int *p=a

#include<stdio.h>
void main()
{
int a[4]={1,2,3,4};
int* p=a;//p=&a[0]与p=a等价"把数组a的首元素的地址赋给指针变量p"
int i;
for(i=0;i<4;i++)
{ 
	printf("a[%d]:%d等价于 ",i,a[i]);
	printf("%d \n",*(p+i));
}
}

3.1指针数组(强调的是数组)

形式 int *p[3] p是一个数组,数组内有3个元素,每个元素都是指针,指向整形数据。

例如:int *a[10] , [10]先和a结合,它声明了一个含有10个元素的数组,其中每个元素都是指向 int 类型的指针。

3.2数组指针 (强调的是指针)

形式:int(*p)[3]===int[3]*p;p是一个指针,指向一个由3个整形数据构成的数组(所有元素看成一个整体)。括号扩的是*p那么就强调的是指针,就是个数组指针。

例如:int (* a)[10], ( ) 和 [ ] 优先级相同,并且都是从左向右结合,* 和 a 先结合,因此 a 是一个指向数组的指针,该指针内含10个元素.
 

视频: 指针数组与数组指针_哔哩哔哩_bilibili

 

#include<stdio.h>
void main()
{
	char x='m';				//定义一个字符 
	char cn[]="china";		//定义一个字符串
	char *ptr=cn;			//定义一个指针指向字符串  
	char *pstr="beijing";	//指针指向字符串的方式来表示字符串 
	char* arry[]={"hefei","nanjing","xian"};//定义一个字符串类型的指针数组 
	int lencn=strlen(cn);    //定义一个指lencn变量指向字符串长度 
	int lenpstr=strlen(pstr);    //定义一个指lenpstr变量指向字符串长度 
	int i;
  	printf("%c \n",x);
  	printf("cn[]是%s,ptr是%s,pstr是%s \n",cn,ptr,pstr);		//打印字符串china 
  	printf("%d, %d\n",lencn,lenpstr);		//打印字符串长度 
  	printf("%c \n",*(ptr+1));				//打印china中的字符h 
  	printf("%c \n",pstr[1]);				//打印beijing字中的e 
  	printf("地址是:%d,数组1第1个字符是:%c,数组1第2个字符是:%c \n",arry[0],*arry[0],*(arry[0]+1));
 	for(i=0;i<6;i++)
	 {
		printf("%c ",*(ptr+i));//注意 输出是cdefgh 
 		printf("--%c \n",*ptr+i);//注意 输出是cdefgh 
 	}
 	/*区别指针数组和数组指针*/
 	//下面是计算输入字符串长度的函数 
 	int j;
 	char sc[100];
	printf("输入字符串:");
	scanf("%s",sc);
	printf("输入字符串是%s-->",sc);
	for(j=0;sc[j]!='\0';++j);//此处分号不能省略 
 	printf("长度是%d",j);
}

  二、函数内指针参数的传递(C程序设计第三版 10.2.3)

#include<stdio.h>
void swap(int* p,int *q)
{
	int temp;
	if(*p>*q)//第一个数大那么交换2个数 
		{
			temp=*p;
			*p=*q;
			*q=temp;
		}
	else
		{
			*p=*p;
			*p=*p;
		}
}
void main()
{
	int a=4,b=3;
//	scanf("%d,%d",&a,&b);//键盘输入格式:           3,5后然后回车 
	printf("第一个数a是%d,第二个数b是%d \n",a,b);
	printf("第一个数a地址是%p,第二个数b地址是%p\n",&a,&b);
	int *point_1=&a;
	int *point_2=&b;
	printf("指针point_1地址是%p,point_2地址是%p\n",point_1,point_2);
	swap(point_1,point_2);//调用的时候直接填的是地址,写成swap(*point_1,*point_2);就出错 
	printf("第一个数a地址是%p,第二个数b地址是%p\n",&a,&b);	//输出结果看地址没有改变 
	printf("指针point_1地址是%p,point_2地址是%p\n",point_1,point_2);	//输出结果看地址没有改变 
	//swap(&a,&b);//和上一句等价 
	printf("交换后第一个数a是%d,第二个数数b是%d\n",a,b);	//输出结果看地址没有改变 	
}

 上面输出的结果,在函数调用时,将实参变量的值传送给行参变量,采取的是“值传递”方式。最后在main函数中输出的a和b的值已是经过交换的值 a=3和b=4

友情提示:技术交流及代码分享QQ群号码:255864236

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值