C语言之指针详解
摘自百度百科的解释
在计算机科学中,指针(Pointer)是编程语言中的一个对象,
利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。
由于通过地址能找到所需的变量单元,
可以说,地址指向该变量单元。
因此,将地址形象化的称为“指针”。
意思是通过它能找到以它为地址的内存单元。
让我来将这里的意思进行用C语言简化一下,尽量达到初学者能理解的程度。
-
将地址形象化的称为“指针”。
ps : 这里的地址是指内存地址,在内存中,每一个字节都有一个地址编号,这个编号就是我们说的内存地址。 -
通过地址能找到所需的变量单元。
ps : 如果你知道,某个变量的地址编号,你就能访问到这个变量的内存,可以读取这块内存的数据也可以进行修改。 -
指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。
ps : 在C语言中,指针是一个变量,这个变量的值是一个内存地址编号。
用一小段代码来示例上面的意思:
#include<stdio.h>
int main(int argc, char* argv[])
{
// 定义一个变量 同时赋值 666
int value = 666;
// int* 语法 表示定义一个 int 型的指针变量,
// &value 通过 & 运算符获取到 变量value 的地址,
// 然后将这个地址 赋值给 pointer int指针变量中
int* pointer = &value;
// 我们通过 使用 * 运算符 来访问 指针变量所保存的地址的值
printf(" 通过指针访问 变量的 value 的值 = %d\n", *pointer);
return 0;
}
至此对于初学者来说还是很懵逼,因为看不见摸不着心里不踏实,总感觉怪怪的,这种过渡期是正常的,没有这种过渡期的或许才是有点问题。
下面我附加一个图片,以方便理解
指针变量的作用,大概就很清晰了,相对于 value(直接访问) 而已,它是属于间接访问的一种手段。
可以读取和修改 value 的值。
ps : 注意指针变量也是有内存地址编号的,也就是说即使是指针变量也是有间接访问的方式的。也就是什么 二级 指针,三级指针,多级指针。附加一句,多级指针什么的,听着高大上,实际上也就那么一回事。
让我们回归到 C语言,做一下简单的小结。
C语言中,变量 以作用来说分为:
- 常规变量比如 , char ,short ,int …
- 以及所对应的 特殊变量(指针) char* , short*,int*…
常规变量 存储的操作数据是值,
指针变量 存储的操作数据是地址编号。(应对上面百科说的,将地址形象化的称为指针)
我以前刚接触 指针变量的时候,挺纳闷一个问题,既然 我们可以通过 value 直接访问 到内存了,为什么还要 使用指针变量这么麻烦来间接访问呢?
以上面的例子为说法:
#include<stdio.h>
int main(int argc, char* argv[])
{
int value = 666;
printf("value 的值 = %d\n", value);
return 0;
}
这样看上面那个使用指针的例子,岂不是多此一举?
如果是像这样的应用,确实多此一举。
换一个例子,先看不用指针变量的写法
#include<stdio.h>
int add(int val)
{
val += 333;
return val;
}
int main(int argc, char* argv[])
{
int value = 666;
// 调用 add()函数 然后将函数的返回,赋值给 value 变量
value = add(value);
printf("value 的值 = %d\n", value);
return 0;
}
接下来看使用指针变量的写法
#include<stdio.h>
void add(int* pointer)
{
*pointer += 333;
}
int main(int argc, char* argv[])
{
int value = 666;
// 调用 add()函数,将value的地址传递过去
add(&value);
printf("value 的值 = %d\n", value);
return 0;
}
第一种,函数参数的传递方式,称为 值传递。
将value 的值传递过去,然后 那边操作完毕之后,再把新值传递回来,然后把 值赋值 给value。
由于无法 在 add()函数中,直接访问到 value 的内存,所以只能让add()函数将结果返回后,在通过赋值修改value的值, 这种方式称为值传递。
第二种,函数参数的传递方式,称为 引用传递。
将value的地址传递过去(由指针变量接收保存),直接在add()函数 中,通过 *pointer(间接访问) 修改value的内存值,这种方式 称为引用传递。
关于更多的指针使用和理解,咋们有缘再讲。
文章时间2019年12月7日19:51:31