重新认识“&”:
“&”是C语言中的一个运算符,它能获得变量的地址,并且它的操作数必须是变量。
#include
int main()
{
int i;
printf("%P\n",&i);
return 0;
}
要用格式控制符%p来打印变量地址,%p输出的结果一般是一个十六进制的整数,代表指针的值,附加前缀0x。指针的值是一个表示地址空间中某个存储器单元的整数。
数组的地址:
#include
int main()
{
int a[10];
printf("%p\n",a);
printf("%p\n",&a);
printf("%p\n",&a[0]);
printf("%p\n",&a[1]);
return 0;
}
结果为:
0061FEF8
0061FEF8
0061FEF8
0061FEFC
综上可知,&a、a、&a[0]代表的地址都是一样的,都是a[0]的地址,且数组内相邻两项的差距为4。
指针:就是保存地址的变量
使用格式 : int i;
int *p=&i; //表示将i的地
址保存到指针变量p中
相关概念:变量的是内存的地址;普通变量的值是实际的值;指针变量的值是具有实际值的变量的地址。
#include
void f(int *p);
int main()
{
int i=6;
printf("&i=%p\n",&i);
f(&i);
return 0;
}
void f(int *p)
{
printf("p=%p\n",p);
}
结果为:
&i=0061FF1C
p=0061FF1C
#include
void f(int *p);
void g(int k);
int main()
{
int i=6;
f(&i);
g(i);
return 0;
}
void f(int *p)
{
printf("*p=%d\n",*p);
*p=25;
}
void g(int k)
{
printf("k=%d\n",k);
}
结果为:
*p=6
k=25
*(左值之所以叫左值是因为出现在赋值号左边的不是变量,而是值,是表达式计算的结果:a[0]=2; *p=3; 是特殊的值,所以叫做左值)
在没有学习指针之前,如果我们想要创建一个函数用来交换两个变量的值是没有办法的,因为本地变量的限制,当我们学习了指针之后就可以完成这一操作,具体代码如下:
#include
void swap(int *pa,int *pb);
void main()
{
int a=5;
int b=6;
return 0;
}
void swap(int *pa,int *pb)
{
int t=*pa; //用变量t来暂时存储变量a的地址
*pa=*pb;
*pb=t; //用t将变量a的地址赋给*pb
使用变量的指针来访问到变量本身就可以摆脱本地变量的限制。
#include
void minmax(int a[],int len,int *max,int *min);
int main()
{
int a[]={1,2,3,4,5,6,7,8,9,22,33,44,55,66,99};
int min,max;
minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
printf("min=%d,max=%d\n",min,max);
return 0;
}
void minmax(int a[],int len,int *min,int *max)
{
int i;
*min=*max=a[0];
for(i=1;i*max)
*max=a[i];
}
}
即输出数组a[]的最大值和最小值。