第五章 指针

一、关于内存那点事

存储器:存储数据器件外存

外存又叫外部存储器,长期存放数据,掉电不丢失数据常见的外存设备:硬盘、flash、rom、u盘、光盘、磁带

内存

内存又叫内部存储器,暂时存放数据,掉电数据丢失常见的内存设备:ram、DDR

二、指针的相关概念

操作系统给每个存储单元分配了一个编号,从0x00 00 00 00~0xff ff ff ff

这个编号咱们称之为地址

指针就是地址

指针变量:是个变量,是个指针变量,即这个变量用来存放一个地址编号在 32 位平台下,地址总线是 32 位的,所以地址是 32 位编号,所以指针变量是 32 位的即4个字节。

注意:

1:

无论什么类型的地址,都是存储单元的编号,在 32 位平台下都是4个字节,

即任何类型的指针变量都是4个字节大小

2:

对应类型的指针变量,只能存放对应类型的变量的地址举例:整型的指针变量,只能存放整型变量的地址

扩展:

字符变量 char ch;ch 占1个字节,它有一个地址编号,这个地址编号就是 ch 的地址整型变量 inta;a占4个字节,它占有4个字节的存储单元,有4个地址编号。

三、指针的定义方法

1.简单的指针

数据类型 * 指针变量名;

int*p;//定义了一个指针变量p

在 定义指针变量的时候*是用来修饰变量的,说明变量p是个指针变量。变量名是 P

2.关于指针的运算符

& 取地址、* 取值

#include<stdio.h>

int main()
{
    //定义一个普通变量
    int a=100;
    //定义一个指针变量
    int *p;
    //给指针变量赋值
    p=&a;
    //值
    printf("a=%d,%d\n",a,*p);
    //地址
    printf("&a=%p,%p\n",&a,p);
    return 0;
}

扩展:

如果在一行中定义多个指针变量,每个指针变量前面都需要加*来修饰

int "p,*q;//定义了两个整型的指针变量p和q

int*p,q;//定义了一个整型指针变量p,和整型的变量q

四、指针的分类 按指针指向的数据的类型来分

1:字符指针

字符型数据的地址

char *p;//定义了一个字符指针变量,只能存放字符型数据的地址编号

char ch:

p= &ch;

2:短整型指针

short int *p;//定义了一个短整型的指针变量 p,只能存放短整型变量的地址

short int a;

p =&a:

3:整型指针

int *p;//定义了一个整型的指针变量p,只能存放整型变量的地址

int a;

p =&a:

注:多字节变量,占多个存储单元,每个存储单元都有地址编号,c语言规定,存储单元编号最小的那个编号,是多字节变量的地址编号。

4:长整型指针

1ong int *p;//定义了一个长整型的指针变量p,只能存放长整型变量的地址

long int a;

p =&a;

5:float 型的指针

float *p;//定义了一个 foat 型的指针变量p,只能存放 foat 型变量的地址

float a;

p =&a:

6:double 型的指针

double *p;//定义了一个 double 型的指针变量p,只能存放 double 型变量的地址

double a;

p =&a:

7:函数指针

8:结构体指针

9:指针的指针

10:数组指针

总结:无论什么类型的指针变量,在32位系统下,都是4个字节,只能存放对应类型的变量的地址编号

五、指针和变量的关系

指针可以存放变量的地址编号

在程序中,引用变量的方法

1:直接通过变量的名称

int a;

a=100:

2:可以通过指针变量来引用变量

int *p;//在定义的时候,*不是取值的意思,而是修饰的意思,修饰p是个指针变量

p=&a;//取a的地址给p赋值,p保存了a的地址,也可以说p指向了a

*p= 100;//在调用的时候*是取值的意思 ,*指针变量 等价于指针指向的变量

注:指针变量在定义的时候可以初始化

int a:

int *p=&a;//用a的地址,给p赋值,因为p是指针变量指针就是用来存放变量的地址的。

*+指针变量 就相当于指针指向的变量

#include<stdio.h>

int main()
{
    int *p1,*p2,temp,a,b;
    p1=&a;
    p2=&b;
    printf("请输入a,b的值:\n");
    scanf("%d,%d",&a,&b);
    temp=*p1;
    *p1=*p2;
    *p2=temp;
    printf("a=%d,b=%d\n",a,b);
    printf("*p1=%d,*p2=%d\n",*p1,*p2);
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值