初步了解指针

文章目录

    • 1.0 前言
    • 1.1 & ----- 取地址符
    • 1.2 指针
    • 1.3 *运算符
    • 1.4 指针基础知识点总结
    • 1.5 指针的应用场景

1.0 前言

不要听到指针就恐惧,指针其实没有这么难

1.1 & ----- 取地址符

前言:
这个&学C语言的同学可能早接触过了,在scanf做一个输入时还特意强调必须加‘&’,不然程序会崩溃。现在,我们就来了解一下这个神秘的‘&’。

注:每一个变量都会有一定的值,有值就会占据空间,编译器就会找一个地址存放这个变量里的值。

作用: 获得变量的地址,操作数只能是变量
注意: 变量的地址用十六进制表示

我们来试试看:

#include

int main(void)
{
     
	int a = 10;
	printf("0x%x",&a);
}

这时会报出一个警告:
在这里插入图片描述

参数的类型是unsigned int,但是给的&a是int *类型
我们不管他,可以看到运行结果:

初步了解指针_第1张图片

可是为什么会有这个warning呢?把%x改成%p就行了,%p是打印地址的,是十六进制的形式,会全部打完,即有多少位打印多少位。左边空缺会补0.所以这样也可以正确输出,还不用加0x

#include

int main(void)
{
     
	int a = 10;
	printf("%p",&a);
	return 0;
}

看,我们也得到了变量a的地址:0x22fe4c
初步了解指针_第2张图片

1.2 指针

前言:
我们是否可以有一个变量的地址,从外面就能访问到那个变量的值?

用指针。

  • 指针就是保存地址的变量
  • 指针可以获取一个地址,访问到对应的变量的值

举个例子:

#include

int main(void)
{
     
 int i = 10;
 int* p = &i;
 printf("&i的值为:%p\n",&i);
 printf("p的值是:%p",p);
 return 0;
}

运行结果:
初步了解指针_第3张图片
大家可以看到,i的地址和p的值一样!实际他们是做了以下操作:
初步了解指针_第4张图片
总结:

  • 普通变量的值是实际的值
  • 指针变量的值是他指向的那个变量的地址

1.3 *运算符

之前我们也讲过’*‘运算符,只不过是把’*当做乘法运算符来计算。这里说的 *,是一个单目运算符,
用法:*地址
作用:取指定地址的值,通过地址可访问到值的一个工具
这么说,*运算符得到的值是对应地址的值,i里储存的值是10,那我们就用%d试一下:

#include

int main(void)
{
     
 int i = 10;
 int* p = &i;
 printf("*p的值为:%d\n",*p);
 printf("*&i的值是:%d",*&i);
 return 0;
}

初步了解指针_第5张图片

  • *p 和 * &i的值都是i的值10,其实这很好理解,p的值是i的地址,在p前面加 *,也就得到10了。至于 *&i,&i先得到了i的地址,再加 *,也获取到了i的值。
  • 可以暂时理解,指针前面有 *号时,它就是一个普通变量,值是他指向的变量的地址。

如果我们改变*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;
} 

初步了解指针_第6张图片
我们在别的函数里改变变量值试试:

#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;
}

初步了解指针_第7张图片

a、b的值被改变了!也就是说:


  • 指针可以在任何地方往他指向的那个变量写东西,改变它的值。
  • 在函数里的变量,出了本函数就不存在了
  • 直接把a,b传进函数,只是复制一份它的值,函数内和函数外的没有任何关联;但是如果把地址传进函数参数,它接收到的就是它本身。

1.4 指针基础知识点总结

初步了解指针_第8张图片

1.5 指针的应用场景

交换两个变量的值:
比如做一个函数,传两个变量的值进参数,在那个函数里,你可以把他们交换过来,但是出了那个函数就没用了,因为你传进去的是复制过来的值。现在我们有了指针,就可以传两个地址进去,用地址来改变上面的值。

如果你希望在一个函数的参数中改变一个指针的值,你就只能传这个指针的指针给这个函数。

#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;

你可能感兴趣的:(C/C++,指针,c语言)