指针基础

#include <stdio.h>

int main()
{   
    int i = 5;
    int* p = &i; 
    printf("%d, %08X\n", i, p);    
    
    *p = 10;    //等价于i = 10;
   
    printf("%d, %08X\n", i, p);

    return 0;
}

运行输出:

i的值变了,但是p的值没有改变,虽然说变量是一段存储空间的别名,但是不见得必须使用这样的别名才能访问和修改这一段空间,通过指针就可以做到这一点

指针本质:

本质上也是一个变量

需要占用一定的内存空间

用于保存内存地址的值

 

int* pi;  int*  pc; long* pl; double* pd;

sizeof(pi) = sizeof(pc) = sizeof(pl) = sizeof(pd) = 4

 在32位系统上地址总线32位,所以32位PC机上指针总是占用4个字节

所以不同类型的指针占用的内存空间大小相同。

 

*号的意义

在指针申明时,*表示所申明的变量为指针

在指针使用时,*表示取指针所指向的内存空间的值,可以通过指针修改内存中的任意地址内容

还表示乘号

 

传值调用与传址调用

指针是变量,因此可以申明为指针参数

当一个函数体内部需要改变实参的值,则需要使用指针参数

函数调用时实参将复制到形参

传址调用可以改变函数外部的值,就是通过指针,通过防盗门钥匙*来改变的。

指针适用于复杂数据类型作为参数的函数中,提高效率

struct Test

{

         int a[10000];

         int b[10000];

}

void f(struct Test t)

{

}

int main()

{

         struct Test tt;

         f(tt);                       //利用传值调用f,struct Test tt玩玩全全复制80000字节到f中,会很耗时,效率降低

         return 0;

}

如果改为

void f(struct Test* t)

{

}

int main()

{

         struct Test tt;

         f(&tt);                       //利用传址调用f,只需要复制4字节到f中,跟上面效率相差20000倍,

         return 0;

}

 

交换函数

void swap(int a, int b)     //交换失败,因为是传值调用,不会对外部变量产生影响

{

           int t = a;

           a = b;

           b = t;

}

改为:

void swap(int* a, int* b)   //交换成功,因为是传址调用

{

           int t = *a;

           *a = *b;

           *b = t;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值