指向数组元素的指针
优先级:数组名后面的 [ ] 和 ( ) 具有相同的优先级,它们的优先级高于 *.
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个元素.
#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