C/C++ 指针入门

指针,c/c++初学者的灾难。

下面我们一步一步,由浅入深走进指针的世界。希望能对大家有所帮助。

写代码时,我们声明一个变量,就是向系统申请了一块内存空间,这个很容易理解。
一个普通的变量有三个重要属性,一是变量名,二是变量地址,三是变量的值。

内存空间里的每个字节,都是有它的地址的。这个地址是从0开始顺序标记的。比如我们声明一个整型变量a,系统会分配给他的四个字节,变量的地址就是第一个字节的地址。变量类型为int,表示变量a要占用此地址和此地址后面连续的三个字节。

接下来,变量的另一个重要属性,就是它的值,比如a=1,就是在这四个字节里,存储的值为0x00000001。

总结一下,声明一个变量,首先变量有名字a,其次变量有地址0x0023FA8B(一个随机地址),最后是它的值 1。

接下来,我们声明一个指针变量int* b;

根据之前的思路,首先变量名是b,其次,它有一个地址,比如说是0x1AF3FA91(随机编的)。
最后它的值,我们都知道指针是存储地址的变量,也就是b的值实际上是一个地址。

为b赋值的时候是这么操作的:b = &a; 
&为取地址运算符。
所以此时b的值为 0x0023FA8B
要通过b去读取真正的值,则要用*解引用,即*b,它的值才是1;

总结1 :指针变量存的是地址,普通变量用取地址运算符&对其赋值,用*解引用读值。

使用指针变量的最常见用途,就是利用其自增功能。
比如我们刚刚声明的变量b,它实际指向的是变量a,a的值是1;
那b+1,指向哪里呢?
是一个未知数,也就是说是一个不确定的数,一般来说访问b+1是不安全的,也是非法的。

但是如果向b赋值为一个数组 比如一个int类型的数组 int arr_a[5] = { 1,2,3,4,5 };
即:
    int* b = arr_a;  
我们知道,数组变量存储的就是该数组的首地址,那么接下来,我们就可以用*b++,来访问数组里的元素了。
连续执行5次
    printf("%d \n", *b++);
会输出 1 2 3 4 5。

总结2: 明确b保存的是地址,b++并不总是+1,而是针对b的类型,偏移相应的字节数。

接下来将一个让大多数初学者头疼的概念,数组指针和指针数组。
其实,这俩货本身并不难区分,难以区分的只是他俩的名字。就像两个人,本来没啥关系,长的也不像,结果一个叫张不三,一个叫张不四。于是,要对上号的时候,大家总会搞混谁是不三,谁是不四。

抛开名字,我们单说这俩货。

首先我们声明三个指针变量: 
    int* pa;
    int* pb;
    int* pc;

如果把他们放到一个数组里,就形成了一个元素全是指针的数组,不取名字,我们就叫他“元素全是指针的数组”。
怎么声明呢?声明元素是int类型的时候,这么声明:int arr_a[3];
所以,声明元素都是int*的数组,自然也是如此:int* arr_pa[3];

于是,我们就可以将先前声明的三个int类型的指针变量放进这个数组了:
    arr_pa[0] = pa;
    arr_pa[1] = pb;
    arr_pa[2] = pc;
    
所以,我们知道arr_pa[0],其实保存的是pa的值,也就是一个整型变量的地址,要取值,只要用*解引用即可:
    printf("%d \n", *arr_pa[0]);
    printf("%d \n", *arr_pa[1]);
    printf("%d \n", *arr_pa[2]);

于是,我们了解了一个 “元素全是指针的数组” 的读写,现在给它取个名字吧,是不是觉得指针数组还算合适。

指针数组相对比较容易理解,那数组指针是个什么东东呢?
我们知道,数组变量的值就是数组的首地址。理论上,数组变量本身就是一个指针,所以下面的赋值是正确的。

int arr_a[5] = { 1,2,3,4,5 };
int* b = arr_a;

所以说整型指针变量b就是一个指向数组的指针。或者用下面的方式声明:
int (*b)[5]

总结3:无论指针数组还是数组指针,都是一重指针范畴,无非就是一个指针在数组里,一个在数组外。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值