初学者快速理解C语言指针

**

C语言中 指针即所指向变量的地址

**
想要在内存中找到某一份数据,首先需要知道其地址,计算机在获取一份数据的过程实际可以理解成一次寻址的过程;

而地址就像是一个人的身份证号,我们想要找到某个人首先要知道他的身份证号才能够按照身份证号在系统中查询确认这个人就是你要找的人,否则就像世界上有很多长得相似的人一样,内存中所存储的数据很多也都是重复的,没有地址计算机无法确认哪一部分是所需要的;

通过下面的例子我们去理解指针即地址这一阐述

定义一个指针
举例:

int *p //定义时带*表示这是定义了一个指针变量,变量类型为int*,与int类型不同
p=&a  //给P赋值  
  在定义指针变量时已知p为指针变量,所以在初始化时我们只需当做普通变量使用即可,不需要在变量P前面加上*。      
  因为指针表示的是所指向变量的地址,那么我们为它初始化时需要加上取地址符&。

如上所示我们完成了一个指针的定义和初始化,而此时我们如果输出P的值可以看到

#include<stdio.h>
int main(void) 
{
	int *p,a=0; //此处定义了一个指针变量*P一个普通变量a
	p = &a;
	printf("此时指针P所指向的值:%d\n此时指针P的值为:%p\n"
	"此时变量a的地址为:%p\n此时变量a的值为:%d\n", *p, p, &a, a);
	/*%d以十进制有符号整数输出,%p以十六进制形式输出地址(指针的值)*/
	return 0;
}

代码运行结果:
指针演示

由上可见指针本身所存储的内容是它所指向的变量的地址,其中第7行代码中“*P”所表示的是获取指针所指向变量的值。

“*”称作指针运算符

值得注意的是计算机在通过指针运算符获取指针指向的数据时需要先获取指针所指向的地址,再获取地址上的值,相比直接读取变量值多了一步。

同样我们也可以对已经赋值的指针进行重写覆盖,替换掉原有值;亦可以用指针去替换其他变量值;

#include<stdio.h>
int main(void)
{
	int* p1, * p2, a = 0, b = 1, c = 2, d = 3;
	p1 = &a;
	p2 = &b;
	printf("此时指针P1所指向的值:%d\n此时指针P1的值为:%p\n"
		"此时指针P2所指向的值:%d\n此时指针P2的值为:%p\n"
		"此时变量a的地址为:%p\n此时变量a的值为:%d\n"
		"此时变量b的地址为:%p\n此时变量b的值为:%d\n", *p1, p1, *p2, p2, &a, a, &b, b);
	p1 = &c;
	d = *p2;
	printf("此时指针P1所指向的值:%d\n此时指针P1的值为:%p\n"
		"此时指针P2所指向的值:%d\n此时指针P2的值为:%p\n"
		"此时变量c的地址为:%p\n此时变量c的值为:%d\n"
		"此时变量d的地址为:%p\n此时变量d的值为:%d\n", *p1, p1, *p2, p2, &c, c, &d, d);
	return 0;
}

运行结果:
赋值替换

以上完成了一次普通变量赋值给指针,同样我们也可以将指针赋值给普通变量

#include<stdio.h>
int main(void) 
{
	int *p1,*p2,a=0,b=1,c=2,d=3;
	p1 = &a;
	p2 = &b;
	*p1 = b;
	c = *p1;
	printf("此时指针P1所指向的值:%d\n此时指针P1的值为:%p\n"
		"此时指针P2所指向的值:%d\n此时指针P2的值为:%p\n"
		"此时变量a的地址为:%p\n此时变量a的值为:%d\n"
		"此时变量b的地址为:%p\n此时变量b的值为:%d\n"
		"此时变量c的地址为:%p\n此时变量c的值为:%d\n", *p1, p1, *p2, p2, &a, a, &b, b, &c, c);
	return 0;
}

使用指针进行变量值转移

运行结果指针赋值给普通变量
我们可以发现使用指针进行赋值时并不会改变指针本身所指向的变量以及地址,因为实际上我们在使用*p1时所操作的是其所指向的变量而非指针本身

二级指针

指针可以指向一个普通变量,同样也可以指向一个指针变量,那么将指向指针变量的指针称作二级指针,举例

#include<stdio.h>
int main(void)
{
	int *p,**p1,a=5,b=1;
	p = &a;
	p1 = &p;
	printf("指针变量P的值:%p\n变量a的地址:%p\n变量a的值:%d\n"
		"p的地址:%p\np1指向的地址:%p\np1所指向的的值:%d\n", p, &a,a,&p, p1, **p1);
}

运行结果
二级指针
同理当我们定义和调用更高级的指针时只需嵌套“*”即可,三级指针int ***p,四级指针int ****p,但最常用的仍是一级与二级指针。

指针运算符与取地址符用法总结
前面提到的*和&两种符号,前者在指针中被称为指针运算符,而在运算中用作乘号,它的几种用法总结如下:

“*” 用法总结
用作乘号a=b*c
定义一个指针变量int *p1;
获取该地址上的值 int *p1,a=1,b; p1=&a;b=*p1;

数组即数组内第零个元素的地址 也可以将其理解为指向第零个元素的指针

举例:

#include<stdio.h>
int main(void)
{
	int *p,a[10] = {1,2,3,4,5};
	p = a; /*因为数组a的值即第零个元素的地址,
	      所以用它为指针P初始化时不需加取地址符&*/
	printf("指针变量P的值:%p\n数组a的值:%p\n"
		"数组a内第零个元素的地址:%p\n数组a内第零个元素的值:%d", p, a, &a[0], a[0]);
}

运行结果:
在这里插入图片描述
可以看出数组值和数组的第零个元素对应的地址相同,将数组从整型(int)换成字符型(char)同样适用该原则,而有关字符串的内容就不在此处展开。

以上内容仍存在许多不足掺杂个人理解但可以帮助初窥C语言的同仁们能够快速理解指针是什么,以及一些简单的用法,而更深入地理解则需要更多的使用和练习,共勉!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值