对于指针的理解(非常基础,供小白使用)

@对于指针的初步理解

之前对于指针得了解一直不够好,而且指针也挺绕的。。。所以看代码的时候,碰到指针有时候挺迷惑的。因此想自己重新梳理一下指针相关的概念。重新温习与巩固一下。一起相互学习。

指针的初步理解

预备知识

理解指针,首先是了解一些 计算机组成 或者是 汇编相关 的一点知识–内存地址。下面是我在网上找的一张内存地址的示意图:

内存地址
在我们计算机的存储中,存储方式是如上图所示的,长条形的方框就是我们的内存,里面用于存储数据。方框里面存储的就是我们所需要的数据(66,22,23,01这些是数据),然后左边就是数据对应的地址。计算机需要根据地址来找到我们的数据,之后再进行相应的运算。

指针的初步理解

指针就是一个地址,但是大部分时候我们叫程序中的某些变量为指针,例如下面的* p,这只是一种简称。实际上是不对的,指针就是地址,* p应该叫做指针变量

由于我不是很喜欢那些比较古板的定义。因此我想直接通过代码来讲解指针。(下面都是我的理解,可能有不对的情况)

int a = 12;  //定义一个变量a,变量名是a,a中存放的值为12
int *p;      //定义一个指针变量为p,p是变量名,里面存放的值只能是一个地址
             //这里的*代表这是一个指针变量,int 表示 指针 指向的变量类型
p = &a;      //&是取地址符号,代表将变量a的地址赋予p。即指针变量p中不再为空
	     //p中的值 为 变量a的地址 例如 100001H 之类的

这里,我们先树立一个概念,在我们定义变量时。对于变量这个东西需要做一些了解。即在我们定义了一个变量并赋值之后,我们需要知道这个变量有几个部分需要注意:

1.变量名    2.变量中存放的数据    3.变量类型    4.变量的地址       

对于指针变量p:
1. 变量名为p
2. 变量存放的数据为某个地址
3. 变量类型为 int*,*代表这是个指针变量 , int 代表这个指针变量所指向的变量为int类型。例如p中存放的数据是a的地址,那么 int 表示a必须为int类型。
4.指针变量p也有自身的地址 例如200000H之类的。

这里需要分辨清楚指针本身的类型,与指针所指向的类型。同时要了解一下它们在内存中的不同。在32位平台中,指针变量本身是只占4个字节长度的内存单元。但是其指向的变量是不一定的,类型不同,字节长度不同。

指针变量的一些例子,可以尝试理解下:

int *ptr;  //指针的类型是int*
char *ptr;//指针的类型是char*
int **ptr;//指针的类型是int**,多级指针变量,

指针使用

上面是定义指针时的相关知识,下面是在使用的的一些知识

int a = 12;
int *p;int **m;
p = &a;
m = &p;
*p = 5;//等价于a = 5;
**m = 5

这里,* p与之前的 int * p不同。这里的 * p 代表 p所指向的变量。也就是说,这里* p就等价于a,两者是一样的。在看代码时,可以就直接将* p翻译成a再去看。 同理 * m等价于p,**m等价于a。

指针的算术运算

指针能够加减,但是不能够乘除。很容易理解,地址加减是有意义的,但是乘除无意义。例如小区门牌号,你能通过门牌号加一或减一找到下一户,但是乘除就没有意义。

指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的,以单元为单位

int put(int *p,int len)   //len为数组长度
{
 for (int i=0;i<len;i++){
  printf("%d ",*(p+i));
 }
}
int main()
{
   int a[5]={1,2,3,4};   //数组第0个就是其地址
   put(a,5);
 } 

这里定义了一个函数将数组a的数据全部输出,靠指针变量+1完成。
这里的+1在内存可不是+1,这里 p 指向的为int类型,32位中,int占4个字节,所以指针变量+1,在内存中是+4,即10000H变成10004H。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值