指针的基本用法

首先明确一个概念:指针就是地址!

然后了解一下指针要用到的符号

1.&  :取地址符。&a ,得到a的地址

  (在c语言中还有一种用法就是按位与,是一个双目运算符)

2. *  在指针中有两种用法

   (1)定义指针变量   int *p;   int *p=&a;  int**pp=&p;

   (2)间接访问符,又称“解引用”   *p=20;  **pp=100;

可以区分这两种情况,定义时,类型后面加 *,说明是指针变量,使用时,不加类型,做左值,说明是要进行解引用

(在c语言中还有一种用法就是乘法符号  3*4=12)

int a : 定义一个整型变量,存放的是整型数据

int *p : 定义的是一个整型的指针变量,存放的是整型地址  

char *p :定义的是一个字符型的指针变量,存放的是字符型的地址   

可以看出,指针变量只比一般变量多一个解引用。

变量      类型      取地址     类型

  a   ->    int          &a——> int *

  e   ->   short       &e——>short *

  p   ->    int *        &p——> int * *

上面就是说,如果一个变量是整型变量,对它取地址就是整型指针

如果是短整形变量,对它取地址就是短整形指针

如果是指针变量,对它取地址就是指针的指针,即二级指针(也可以说指针的地址,地址的地址)

int main()

{
 int a = 10;
 int b = 20;
 int *p = &a; //定义一个指针变量保存a的地址
 *p = 100;   //a = 100;

                  //p指向a,通过对p解引用,修改a的值

 p = &b;
 *p = 200;   //b = 200;

                  //p又指向b,通过对p解引用,修改b的值


 int **pp = &p;//定义一个指针的指针变量pp,保存的是指针变量p的地址

                      //p是指针变量,也是一个变量,所以它也有地址,它的地址用也是用一个指针保存的,只不过这个指针                        有点特殊,是一个二级指针
 *pp = &a;   //p = &a;  

                   //对pp解引用,就是p,p保存a的地址

 **pp = 1000;  //a = 1000;

                       //对pp解引用一次是变量p的值,再解一次引用就相当于对指针变量p解引用,就是变量a的值。
 *pp = &b;   //p = &b;

                   //对pp解引用就是变量p的值,p保存了b的地址
 **pp = 2000;  //b = 2000;

                      //对pp解引用一次是变量p的值,再解一次引用就相当于对指针变量p解引用,就是变量a的值。

 return 0;
}


指针占用的字节数:

sizeof(int *)   //4

sizeof(char *)  //4

sizeof(short *)  //4

sizeof(int **)   //4

sizeof(int ******)  //4

可以看出不管是什么类型的几级指针,都占四个字节,我们一般也默认指针占四个字节。

但并不是一定占四个字节,占多少个字节与平台有关,在32位的平台上,最多用4个字节就够了,因为32位最多能表示的数据范围就是2的32次方,即4个G。分配4个字节,一个字节8位,足够表示4个G。但是在64位的平台就不行了,必须要分配8个字节才能表示2的64次方个数。

所以在X86或者是32位的平台上,指针占4个字节

在X64或者64位的平台上,指针占8个字节

如果有的题说到了在一个64位的平台上,一定要留意指针占8个字节。


如果定义了整型两个变量,对他们取地址,会发现它们的地址总是相差12个字节,因为编译器的地址都是按顺序分配的,应该是相差4个字节,但是微软的编译器防止越界,会在两个变量的地址中间加两个相同类型的变量,所以整型变量之间的地址一般相差12个字节。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值