数据结构预备知识模块一:指针及指针变量
程序员文章站
2024-02-29 17:13:40
...
在我们数据结构中,我们主要研究的是数据变量以及之间关系的学科,在计算机中数据的存储是基于连续存储和离散存储机制实现的,其中连续存储顾名思义就是在计算机存储设备上开辟连续的物理存储空间来存储数据,使得数据之间在物理和逻辑上都是相邻的,因此这样的实现我们可以借助“数组”这一数据结构。这一数据结构因为其内部数据的存储是连续的,所以其寻址定位就相对简单化了。我们可以直接进行数据的访问和操作。对于离散存储,相反地,就是数据的存储在物理上不都是相互邻近的,这就需要解决如何把孤立数据的内存地址连续起来的问题。这里就用到了“链表”的存储结构实现。链表其实很好理解呢,类比武侠小说中的藏宝图,下一个藏宝图地点在上一个藏宝图中做了说明。在这里指示下一个藏宝图地点的说明书在计算机里就是指针(这个例子有点牵强……)。
在C/C++里面指针就是数据在内存中的地址。因为在CPU访问内存空间时需要的是数据的地址*(指针)。我们在编程中使用“*”来标识一个变量是指针变量。例如:
int *p;
这里*p就是把p标识作为一个指针变量。p就是一个地址助记符。当程序编译链接时,就会把它转换成内存中的实际地址。
例如:
int *a,*b,*c;
c = a+b;
// 对指针变量赋值不需要带*号。假设我们a,b,c的地址分别为0x100,0x200,0x300.
//那么上面 的式子在编译时候就等于:0x300 = (0x100)+(0x200)。其中()是取值符号。表示将地0x100上的值取出来
另外,指针变量存储了数据的内存地址,同时,通过指针变量可获得该地址上的数据
int a = 5;
int *p = &a;
printf("%d,%d\n",a,*p);
// output
5,5
注意:“*p”在这里是取值操作。当给指针变量赋值时不需要加“*”。
例子:
假设一个int变量a, P_a是指向a的指针,那么“*&a”和“&*p_a”分别表示什么?
*&a = *(&a) = a
&*P_a = &(*P_a) = p_a;
总结:“*”星号的用途:
1.表示乘号
2.指针变量的标识
3.是一种取值操作,获取指针变量指向的数据。
下一系列模块:结构体