黑马程序员——C语言中的指针变量初步认识

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

在认识指针之前,已经学过很多变量类型了,包括整形、字符型、浮点型等等,这些都还比较好理解。

不过C语言的精髓就在于指针啊!

今天就来说说自己对于传说中的”指针“理解。


什么是指针?

指针是在C语言中经常使用的一种变量类型。运用指针是一种主要的编程方法。指针可以”辅助“表示各种数据结构,除了简单的整形、字符型

还能很方便的操纵数组和字符串,像汇编语言一样处理内存地址,也就是老师们常说的,”更底层“的方法,从而编写出精炼而高效的程序。

提到指针,提到内存,就不得不先说说计算机系统的相关知识,“知其然知其所以然”嘛!

存储器又是什么?

在计算机中,所有的数据都是存放在存储器中的。一般把存储器的一个字节称为一个内存单元。

在老师的PPT中也形象的画过内存单元,一个”int“占用4个单元,一个"char"占1个单元。当然,在不同的系统中,略有不同,这

里就不多说了。

每一个变量被创建之后,就被内存保存起来,我们除了可以直接使用变量访问,还可以用更灵活的指针来访问对应的变量。

指针是如何访问的?

数据在内存中是有序的,就像是我们的门牌号一样,”张三“住在XX街XX号,数据也一样,在内存中有自己的地址。指针就是通

过地址来访问我们需要调用的数据的。

指针是怎么”指“的?

终于到了重头戏了!

指针本身是一个变量,它又如何”指“向另外一个变量呢?

通俗的讲,指针就像是一张小卡片,小卡片上记录着一个数据的内存地址。我们拿着这张”小卡片“就可以找到需要的东西。

这里很容易模糊的是,指针和所指的变量是两个完全不相同的数据类型。指针的值是地址,是我们赋给它的。这个地址上存的东

西,才是我们真正在寻找的东西。

用一句话来说,就是:”指针“是指地址,是常量,”指针变量“是指取值为地址的变量。

定义指针的目的是为了通过指针去访问内存的单元。

还是有点”绕“!

没关系,在代码中,可以更深入的理解。


<span style="font-family:Microsoft YaHei;font-size:18px;">int *p1;
char *p2;
float *p3;
</span>

这就是在代码中,创建一个指针的方法。

这里要注意,虽然”*“是与后面变量名放在一起,但事实上,它的意思是(int *)p1,p1是一个”指向int型数据“的指针。指针

的名字是p1。

下面这段代码,将指针与变量真正的联系起来。


<span style="font-family:Microsoft YaHei;font-size:18px;">int *p = &a;</span>

这段代码的意思是,名字是p的指针,指向一个int型的变量a。

”&“的意思是取a的地址。

所以p的”值“是”&a“,是一个表示内存中地址的数据。

指针怎么操纵变量?

#include<stdio.h>
int main(){
	int a=6;
	int *p = &a;
	printf("%d",*p);
	return 0;
}

这段代码打印的是并不是”a",而是打印的"*p“。

一个printf函数就看出了指针的”道道“:p的值是a的地址,*p的值就是a本身!

那么通过指针能间接的改变a的值吗?答案是可以,不然怎么叫操纵呢。


<span style="font-family:Microsoft YaHei;font-size:18px;">#include<stdio.h>
int main(){
	int a=6;
	int *p = &a;
	*p = 5;
        printf("%d",a);
        
	return 0;
}</span>

这里我们直接给*p赋值5,最后p所指向的a也变成5了。

再来看一段稍微复杂一点的,比大小。


<span style="font-family:Microsoft YaHei;font-size:18px;">#include<stdio.h>
int main(){
	int a = 0, b = 0, *p, *p1, *p2;
    scanf("%d%d", &a, &b);
    p1 = &a;
    p2 = &b;
    if (a < b){
        p = p1;
        p1 = p2;
        p2 = p;
    }
    printf("a = %d, b = %d\n", a, b);
    printf("max = %d, min = %d\n", *p1, *p2);
    return 0;
}</span>

看出些什么不同吗?

指针之间也能相互赋值!他们之间交换的是什么呢?没错,是地址,之前提到过,指针的值是常量,也是可变的。

在交换之后,他们”指向“的变量也变化了。

其实指针跟之前所学的变量并没有什么本质上的不同,唯一不同就是额外的功能,可以间接的表示内存地址上的变量。

指针在函数中的应用

既然指针可以表示一个变量,那么可以应用到函数里吗?当然可以!指针也可以作为函数的参数!

<span style="font-family:Microsoft YaHei;font-size:18px;">#include<stdio.h>
int square(int n){
	return n * n;
}
int main(){
	int num = 2;
	printf ("The original number is %d\n" , num);
	printf ("The new value of number is %d\n" , square(num));
	return 0;
}</span>


这里定义了一个square函数,也就是求平方的函数。

在没有使用指针之前,传给函数的参数是整形变量n,返回值也是一个整形,即n*n。

然后我们打印了num的值,也就是2。下一行打印num的平方的值,输出4。

下面用指针来做。



<span style="font-family:Microsoft YaHei;font-size:18px;">void square(int* n){
	*n=*n**n;
}
int main(){
	int num = 2;
	printf ("The original number is %d\n" , num);
	square(&num);
	printf ("The new value of number is %d\n" , num);
	return 0;
}</span>


跟上一个函数有什么不同呢?

返回值不同:

首先从第一行的square函数,就看到返回值不同。之前返回的是int,而这次是void也就是说并没有返回值。

传进来的参数不同:

第一次传的是整形,int n。而第二次呢,是 int* n,是一个指针!

在调用的时候,写法也有区别:

第一次squate(num),第二次是square(&num)。










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值