不要听到指针就恐惧,指针其实没有这么难
前言:
这个&学C语言的同学可能早接触过了,在scanf做一个输入时还特意强调必须加‘&’,不然程序会崩溃。现在,我们就来了解一下这个神秘的‘&’。
注:每一个变量都会有一定的值,有值就会占据空间,编译器就会找一个地址存放这个变量里的值。
作用: 获得变量的地址,操作数只能是变量
注意: 变量的地址用十六进制表示
我们来试试看:
#include
int main(void)
{
int a = 10;
printf("0x%x",&a);
}
参数的类型是unsigned int,但是给的&a是int *类型
我们不管他,可以看到运行结果:
可是为什么会有这个warning呢?把%x改成%p就行了,%p是打印地址的,是十六进制的形式,会全部打完,即有多少位打印多少位。左边空缺会补0.所以这样也可以正确输出,还不用加0x
#include
int main(void)
{
int a = 10;
printf("%p",&a);
return 0;
}
前言:
我们是否可以有一个变量的地址,从外面就能访问到那个变量的值?
用指针。
举个例子:
#include
int main(void)
{
int i = 10;
int* p = &i;
printf("&i的值为:%p\n",&i);
printf("p的值是:%p",p);
return 0;
}
运行结果:
大家可以看到,i的地址和p的值一样!实际他们是做了以下操作:
总结:
之前我们也讲过’*‘运算符,只不过是把’*当做乘法运算符来计算。这里说的 *,是一个单目运算符,
用法:*地址
作用:取指定地址的值,通过地址可访问到值的一个工具
这么说,*运算符得到的值是对应地址的值,i里储存的值是10,那我们就用%d试一下:
#include
int main(void)
{
int i = 10;
int* p = &i;
printf("*p的值为:%d\n",*p);
printf("*&i的值是:%d",*&i);
return 0;
}
- 可以暂时理解,指针前面有 *号时,它就是一个普通变量,值是他指向的变量的地址。
如果我们改变*p的值,它指向的那个变量的值也会被改变吗?我们来试试看。
#include
int main(void)
{
int a = 4;
int b = 5;
int *p = &a;
int *q = &b;
printf("a的值为:%d\n",a);
printf("b的值为:%d\n",b);
printf("这里试图用指针来改变a、b的值:\n");
*p = 7;
*q = 7;
printf("改变后a的值为:%d\n",a);
printf("改变后b的值为:%d\n",b);
return 0;
}
#include
void f(int *a,int *b);
void q(int a,int b);
int main(void)
{
int a = 4;
int b = 5;
printf("原本a、b的值是:%d,%d\n\n",a,b);
f(&a,&b);//把a、b的地址传进f函数,在f函数里用改变后 ,在那个地址上的a、b也会发生改变
printf("被f函数用指针修改后的a、b的值是:%d,%d\n\n",a,b);
q(a,b);//把a、b的值传进q函数,只是复制一份a、b的值,所以main函数里的a、b不会改变
printf("被q函数修改后的a、b的值是:%d,%d\n\n",a,b);
return 0;
}
void f(int *p,int *q)
{
printf("这里试图在f函数里用指针修改a、b的值;\n");
*p = 7;
*q = 7;
}
void q(int a,int b)
{
printf("这里试图在q函数里修改a、b的值;\n");
a = 6;
b = 6;
}
a、b的值被改变了!也就是说:
交换两个变量的值:
比如做一个函数,传两个变量的值进参数,在那个函数里,你可以把他们交换过来,但是出了那个函数就没用了,因为你传进去的是复制过来的值。现在我们有了指针,就可以传两个地址进去,用地址来改变上面的值。
如果你希望在一个函数的参数中改变一个指针的值,你就只能传这个指针的指针给这个函数。
#include
void swap(int *pa,int *pb);
int main(void)
{
int a = 4;
int b = 5;
swap(&a,&b);//把a和b的地址传进swap函数
printf("a=%d,b=%d\n",a,b);
return 0;
}
void swap(int *pa,int *pb)
{
int t = *pa;// *pa代表的变量是a,实际做的事是定义变量t,‘t = 4’。
*pa = *pb;// *pb代表的变量是b,实际做的事是‘a = 5 ’
*pb = t;// t的值是4,实际上做的事是‘b = 5’
}
做的是实际上就是这样:
int a = 4;
int b = 5;
int t;
t = a;//t = 4;
a = b;//a = 5;
b = t;//b = 4;